/ Hex Artifact Content
Login

Artifact e3ed5475d4611f28f3cad06c0454a354148f3bb0ce21c75659ce737dc13f7968:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
04b0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
04c0: 74 20 74 68 61 74 20 6f 77 6e 73 20 61 20 56 64  t that owns a Vd
04d0: 62 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 50 61  be object..*/.Pa
04e0: 72 73 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  rse *sqlite3Vdbe
04f0: 50 61 72 73 65 72 28 56 64 62 65 20 2a 70 29 7b  Parser(Vdbe *p){
0500: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 50 61  .  return p->pPa
0510: 72 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  rse;.}../*.** Ch
0520: 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 73  ange the error s
0530: 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20  tring stored in 
0540: 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a  Vdbe.zErrMsg.*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20 63  Error(Vdbe *p, c
0570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
0580: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
0590: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
05a0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
05b0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76 61  ->zErrMsg);.  va
05c0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
05d0: 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  at);.  p->zErrMs
05e0: 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  g = sqlite3VMPri
05f0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
0600: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
0610: 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d(ap);.}../*.** 
0620: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c  Remember the SQL
0630: 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72   string for a pr
0640: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0650: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0660: 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65  3VdbeSetSql(Vdbe
0670: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
0680: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70 72  *z, int n, u8 pr
0690: 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20  epFlags){.  if( 
06a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
06b0: 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20   p->prepFlags = 
06c0: 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66 28  prepFlags;.  if(
06d0: 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53 51   (prepFlags & SQ
06e0: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41 56  LITE_PREPARE_SAV
06f0: 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ESQL)==0 ){.    
0700: 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b 0a  p->expmask = 0;.
0710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
0720: 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d  >zSql==0 );.  p-
0730: 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44  >zSql = sqlite3D
0740: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
0750: 7a 2c 20 6e 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  z, n);.}..#ifdef
0760: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
0770: 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41  ORMALIZE./*.** A
0780: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
0790: 20 74 6f 20 74 68 65 20 56 64 62 65 2d 3e 70 44   to the Vdbe->pD
07a0: 62 6c 53 74 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  blStr list..*/.v
07b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
07c0: 64 64 44 62 6c 71 75 6f 74 65 53 74 72 28 73 71  ddDblquoteStr(sq
07d0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
07e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
07f0: 7a 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  z){.  if( p ){. 
0800: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
0810: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
0820: 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a     DblquoteStr *
0830: 70 53 74 72 20 3d 20 73 71 6c 69 74 65 33 44 62  pStr = sqlite3Db
0840: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 0a  MallocRawNN(db,.
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
0870: 6f 66 28 2a 70 53 74 72 29 2b 6e 2b 31 2d 73 69  of(*pStr)+n+1-si
0880: 7a 65 6f 66 28 70 53 74 72 2d 3e 7a 29 29 3b 0a  zeof(pStr->z));.
0890: 20 20 20 20 69 66 28 20 70 53 74 72 20 29 7b 0a      if( pStr ){.
08a0: 20 20 20 20 20 20 70 53 74 72 2d 3e 70 4e 65 78        pStr->pNex
08b0: 74 53 74 72 20 3d 20 70 2d 3e 70 44 62 6c 53 74  tStr = p->pDblSt
08c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 44 62 6c  r;.      p->pDbl
08d0: 53 74 72 20 3d 20 70 53 74 72 3b 0a 20 20 20 20  Str = pStr;.    
08e0: 20 20 6d 65 6d 63 70 79 28 70 53 74 72 2d 3e 7a    memcpy(pStr->z
08f0: 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 7d  , z, n+1);.    }
0900: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
0910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0920: 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a  BLE_NORMALIZE./*
0930: 0a 2a 2a 20 7a 49 64 20 6f 66 20 6c 65 6e 67 74  .** zId of lengt
0940: 68 20 6e 49 64 20 69 73 20 61 20 64 6f 75 62 6c  h nId is a doubl
0950: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
0960: 69 65 72 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ier.  Check to s
0970: 65 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 69 64  ee if.** that id
0980: 65 6e 74 69 66 69 65 72 20 69 73 20 72 65 61 6c  entifier is real
0990: 6c 79 20 75 73 65 64 20 61 73 20 61 20 73 74 72  ly used as a str
09a0: 69 6e 67 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a  ing literal..*/.
09b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  int sqlite3VdbeU
09c0: 73 65 73 44 6f 75 62 6c 65 51 75 6f 74 65 64 53  sesDoubleQuotedS
09d0: 74 72 69 6e 67 28 0a 20 20 56 64 62 65 20 2a 70  tring(.  Vdbe *p
09e0: 56 64 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  Vdbe,           
09f0: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0a00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 20  const char *zId 
0a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
0a30: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 69 64 65  ouble-quoted ide
0a40: 6e 74 69 66 69 65 72 2c 20 61 6c 72 65 61 64 79  ntifier, already
0a50: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
0a60: 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70    DblquoteStr *p
0a70: 53 74 72 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  Str;.  assert( z
0a80: 49 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Id!=0 );.  if( p
0a90: 56 64 62 65 2d 3e 70 44 62 6c 53 74 72 3d 3d 30  Vdbe->pDblStr==0
0aa0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
0ab0: 6f 72 28 70 53 74 72 3d 70 56 64 62 65 2d 3e 70  or(pStr=pVdbe->p
0ac0: 44 62 6c 53 74 72 3b 20 70 53 74 72 3b 20 70 53  DblStr; pStr; pS
0ad0: 74 72 3d 70 53 74 72 2d 3e 70 4e 65 78 74 53 74  tr=pStr->pNextSt
0ae0: 72 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  r){.    if( strc
0af0: 6d 70 28 7a 49 64 2c 20 70 53 74 72 2d 3e 7a 29  mp(zId, pStr->z)
0b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
0b20: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0b30: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0b40: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
0b50: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
0b60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0b70: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
0b80: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
0b90: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
0ba0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73  char *zTmp;.  as
0bb0: 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42  sert( pA->db==pB
0bc0: 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20  ->db );.  tmp = 
0bd0: 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42  *pA;.  *pA = *pB
0be0: 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20  ;.  *pB = tmp;. 
0bf0: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78   pTmp = pA->pNex
0c00: 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d  t;.  pA->pNext =
0c10: 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42   pB->pNext;.  pB
0c20: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a  ->pNext = pTmp;.
0c30: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72    pTmp = pA->pPr
0c40: 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20  ev;.  pA->pPrev 
0c50: 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pB->pPrev;.  p
0c60: 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b  B->pPrev = pTmp;
0c70: 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53  .  zTmp = pA->zS
0c80: 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d  ql;.  pA->zSql =
0c90: 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d   pB->zSql;.  pB-
0ca0: 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69  >zSql = zTmp;.#i
0cb0: 66 20 30 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d  f 0.  zTmp = pA-
0cc0: 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 41 2d  >zNormSql;.  pA-
0cd0: 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 70 42 2d 3e  >zNormSql = pB->
0ce0: 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e  zNormSql;.  pB->
0cf0: 7a 4e 6f 72 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b  zNormSql = zTmp;
0d00: 0a 23 65 6e 64 69 66 0a 20 20 70 42 2d 3e 65 78  .#endif.  pB->ex
0d10: 70 6d 61 73 6b 20 3d 20 70 41 2d 3e 65 78 70 6d  pmask = pA->expm
0d20: 61 73 6b 3b 0a 20 20 70 42 2d 3e 70 72 65 70 46  ask;.  pB->prepF
0d30: 6c 61 67 73 20 3d 20 70 41 2d 3e 70 72 65 70 46  lags = pA->prepF
0d40: 6c 61 67 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70  lags;.  memcpy(p
0d50: 42 2d 3e 61 43 6f 75 6e 74 65 72 2c 20 70 41 2d  B->aCounter, pA-
0d60: 3e 61 43 6f 75 6e 74 65 72 2c 20 73 69 7a 65 6f  >aCounter, sizeo
0d70: 66 28 70 42 2d 3e 61 43 6f 75 6e 74 65 72 29 29  f(pB->aCounter))
0d80: 3b 0a 20 20 70 42 2d 3e 61 43 6f 75 6e 74 65 72  ;.  pB->aCounter
0d90: 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  [SQLITE_STMTSTAT
0da0: 55 53 5f 52 45 50 52 45 50 41 52 45 5d 2b 2b 3b  US_REPREPARE]++;
0db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
0dc0: 20 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72   the Vdbe.aOp ar
0dd0: 72 61 79 20 73 6f 20 74 68 61 74 20 69 74 20 69  ray so that it i
0de0: 73 20 61 74 20 6c 65 61 73 74 20 6e 4f 70 20 65  s at least nOp e
0df0: 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65 72 20 0a  lements larger .
0e00: 2a 2a 20 74 68 61 6e 20 69 74 73 20 63 75 72 72  ** than its curr
0e10: 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73  ent size. nOp is
0e20: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
0e30: 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
0e40: 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f  qual.** to 1024/
0e50: 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a  sizeof(Op)..**.*
0e60: 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  * If an out-of-m
0e70: 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75  emory error occu
0e80: 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e  rs while resizin
0e90: 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65 74  g the array, ret
0ea0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  urn.** SQLITE_NO
0eb0: 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61 73  MEM. In this cas
0ec0: 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20 56  e Vdbe.aOp and V
0ed0: 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d  dbe.nOpAlloc rem
0ee0: 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ain .** unchange
0ef0: 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74 68  d (this is so th
0f00: 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61  at any opcodes a
0f10: 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
0f20: 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72   can be .** corr
0f30: 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65  ectly deallocate
0f40: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
0f50: 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64 62   rest of the Vdb
0f60: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
0f70: 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64  t growOpArray(Vd
0f80: 62 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b  be *v, int nOp){
0f90: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b  .  VdbeOp *pNew;
0fa0: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
0fb0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54  >pParse;..  /* T
0fc0: 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  he SQLITE_TEST_R
0fd0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f  EALLOC_STRESS co
0fe0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
0ff0: 6e 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  n is designed to
1000: 20 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65   force.  ** more
1010: 20 66 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f   frequent reallo
1020: 63 73 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f  cs and hence pro
1030: 76 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74  vide more opport
1040: 75 6e 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a  unities for .  *
1050: 2a 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20  * simulated OOM 
1060: 66 61 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f  faults.  SQLITE_
1070: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
1080: 45 53 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79  ESS is generally
1090: 20 75 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e   used.  ** durin
10a0: 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20  g testing only. 
10b0: 20 57 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   With SQLITE_TES
10c0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
10d0: 20 67 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72   grow the op arr
10e0: 61 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ay.  ** by the m
10f0: 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72  inimum* amount r
1100: 65 71 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68  equired until th
1110: 65 20 73 69 7a 65 20 72 65 61 63 68 65 73 20 35  e size reaches 5
1120: 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a  12.  Normal.  **
1130: 20 6f 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68   operation (with
1140: 6f 75 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  out SQLITE_TEST_
1150: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20  REALLOC_STRESS) 
1160: 69 73 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65  is to double the
1170: 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69   current.  ** si
1180: 7a 65 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72  ze of the op arr
1190: 61 79 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66  ay or add 1KB of
11a0: 20 73 70 61 63 65 2c 20 77 68 69 63 68 65 76 65   space, whicheve
11b0: 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f  r is smaller. */
11c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
11d0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
11e0: 53 53 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  SS.  sqlite3_int
11f0: 36 34 20 6e 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f  64 nNew = (v->nO
1200: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 32 2a  pAlloc>=512 ? 2*
1210: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1220: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1250: 74 36 34 29 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b  t64)v->nOpAlloc+
1260: 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71  nOp);.#else.  sq
1270: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77  lite3_int64 nNew
1280: 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (v->nOpAlloc 
1290: 3f 20 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  ? 2*(sqlite3_int
12a0: 36 34 29 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20  64)v->nOpAlloc. 
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 3a 20 28 73 71 6c 69 74 65         : (sqlite
12d0: 33 5f 69 6e 74 36 34 29 28 31 30 32 34 2f 73 69  3_int64)(1024/si
12e0: 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e  zeof(Op)));.  UN
12f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1300: 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  Op);.#endif..  /
1310: 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
1320: 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42 45  e size of a VDBE
1330: 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20 74   does not grow t
1340: 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66  oo large */.  if
1350: 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e  ( nNew > p->db->
1360: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1370: 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a  MIT_VDBE_OP] ){.
1380: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
1390: 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ult(p->db);.    
13a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13b0: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  MEM;.  }..  asse
13c0: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
13d0: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
13e0: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 76  assert( nNew>=(v
13f0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
1400: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
1410: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
1420: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
1430: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
1440: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1450: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73  p->szOpAlloc = s
1460: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
1470: 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b  ze(p->db, pNew);
1480: 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    v->nOpAlloc
1490: 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f   = p->szOpAlloc/
14a0: 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20  sizeof(Op);.    
14b0: 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20  v->aOp = pNew;. 
14c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65   }.  return (pNe
14d0: 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  w ? SQLITE_OK : 
14e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14f0: 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  T);.}..#ifdef SQ
1500: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
1510: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
1520: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
1530: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
1540: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
1550: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
1560: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
1570: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
1580: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
1590: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
15a0: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
15b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
15c0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
15d0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
15e0: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
15f0: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
1600: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1610: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1620: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1630: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1640: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1650: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
1660: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
1670: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1680: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
1690: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
16a0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
16b0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
16c0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
16d0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
16e0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
16f0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
1700: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1710: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1720: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1730: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1740: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1750: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
1760: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
1770: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
1780: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
1790: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
17a0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73  ** operand..*/.s
17b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
17c0: 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70  NLINE int growOp
17d0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
17e0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
17f0: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73  2, int p3){.  as
1800: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  sert( p->nOpAllo
1810: 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  c<=p->nOp );.  i
1820: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
1830: 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 1) ) return 1;
1840: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
1850: 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b  pAlloc>p->nOp );
1860: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1870: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1880: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1890: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
18a0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
18b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
18c0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
18d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
18e0: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
18f0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
1900: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1910: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1920: 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30 20    assert( op>=0 
1930: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
1940: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
1950: 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =i ){.    return
1960: 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20   growOp3(p, op, 
1970: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d  p1, p2, p3);.  }
1980: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
1990: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
19a0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
19b0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
19c0: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
19d0: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
19e0: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
19f0: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
1a00: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
1a10: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
1a20: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
1a30: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
1a40: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70  N_COMMENTS.  pOp
1a50: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1a60: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1a70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1a80: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
1a90: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
1aa0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Trace ){.    sql
1ab0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
1ac0: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
1ad0: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
1ae0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1af0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1b00: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1b10: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1b20: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1b30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1b40: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
1b50: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
1b60: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
1b70: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
1b80: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1b90: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
1ba0: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
1bb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bc0: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
1bd0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1be0: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1bf0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1c00: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1c10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c20: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1c30: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1c40: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
1c50: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1c60: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
1c70: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1c80: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1c90: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  , p2, 0);.}../* 
1ca0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1cb0: 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  r an uncondition
1cc0: 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  al jump to instr
1cd0: 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a  uction iDest.*/.
1ce0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 47  int sqlite3VdbeG
1cf0: 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oto(Vdbe *p, int
1d00: 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75 72   iDest){.  retur
1d10: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1d20: 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op3(p, OP_Goto, 
1d30: 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a  0, iDest, 0);.}.
1d40: 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1d50: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 73  e to cause the s
1d60: 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62 65  tring zStr to be
1d70: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20   loaded into.** 
1d80: 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a 2a  register iDest.*
1d90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1da0: 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62 65  eLoadString(Vdbe
1db0: 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20   *p, int iDest, 
1dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
1dd0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1de0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1df0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1e00: 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c 20  iDest, 0, zStr, 
1e10: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0);.}../*.** Gen
1e20: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1e30: 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c 74  initializes mult
1e40: 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20 74  iple registers t
1e50: 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65  o string or inte
1e60: 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ger.** constants
1e70: 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 73  .  The registers
1e80: 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65 73   begin with iDes
1e90: 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 63  t and increase c
1ea0: 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a 2a  onsecutively..**
1eb0: 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69 73   One register is
1ec0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72   initialized for
1ed0: 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65 72   each characgter
1ee0: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20 46   in zTypes[].  F
1ef0: 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20 63  or each.** "s" c
1f00: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79 70  haracter in zTyp
1f10: 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74  es[], the regist
1f20: 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  er is a string i
1f30: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
1f40: 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f  s.** not NULL, o
1f50: 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68 65  r OP_Null if the
1f60: 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c 6c   value is a null
1f70: 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20 65   pointer.  For e
1f80: 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74 65  ach "i" characte
1f90: 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b 5d  r.** in zTypes[]
1fa0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1fb0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1fc0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
1fd0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
1fe0: 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  string does not 
1ff0: 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68 65  end with "X" the
2000: 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f  n an OP_ResultRo
2010: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  w instruction.**
2020: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f   is generated fo
2030: 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 73  r the values ins
2040: 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  erted..*/.void s
2050: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
2060: 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oad(Vdbe *p, int
2070: 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   iDest, const ch
2080: 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29  ar *zTypes, ...)
2090: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
20a0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
20b0: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
20c0: 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72  , zTypes);.  for
20d0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65  (i=0; (c = zType
20e0: 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  s[i])!=0; i++){.
20f0: 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29      if( c=='s' )
2100: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2110: 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61  ar *z = va_arg(a
2120: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
2130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2140: 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30  beAddOp4(p, z==0
2150: 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
2160: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
2170: 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20  t+i, 0, z, 0);. 
2180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
2190: 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  'i' ){.      sql
21a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
21b0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76 61  , OP_Integer, va
21c0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20 69  _arg(ap, int), i
21d0: 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  Dest+i);.    }el
21e0: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  se{.      goto s
21f0: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77  kip_op_resultrow
2200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2220: 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  p, OP_ResultRow,
2230: 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69 70   iDest, i);.skip
2240: 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a 20  _op_resultrow:. 
2250: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
2260: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
2270: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
2280: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
2290: 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  s a pointer..*/.
22a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
22b0: 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70  ddOp4(.  Vdbe *p
22c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22d0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
22e0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
22f0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2300: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2310: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2330: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2340: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2360: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
2370: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
2380: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
2390: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
23a0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f   char *zP4,    /
23b0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
23c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
23d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
23e0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
23f0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
2400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2410: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
2420: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
2430: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
2440: 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65  ddr, zP4, p4type
2450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2470: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
2480: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
2490: 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e  lue with a P4_IN
24a0: 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41  T64 or.** P4_REA
24b0: 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  L type..*/.int s
24c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
24d0: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24f0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
2500: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
2510: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2520: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2530: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2550: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
2560: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
2570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2580: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
2590: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
25a0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
25b0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
25c0: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
25d0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
25e0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
25f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2600: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2610: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
2620: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2630: 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56  ocRawNN(sqlite3V
2640: 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20  dbeDb(p), 8);.  
2650: 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d  if( p4copy ) mem
2660: 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c  cpy(p4copy, zP4,
2670: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   8);.  return sq
2680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2690: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
26a0: 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70  3, p4copy, p4typ
26b0: 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  e);.}..#ifndef S
26c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
26d0: 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  IN./*.** Return 
26e0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
26f0: 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c 41  he current EXPLA
2700: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62 61  IN QUERY PLAN ba
2710: 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61  seline..** 0 mea
2720: 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e  ns "none"..*/.in
2730: 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  t sqlite3VdbeExp
2740: 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73 65  lainParent(Parse
2750: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
2760: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
2770: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
2780: 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ain==0 ) return 
2790: 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  0;.  pOp = sqlit
27a0: 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61 72  e3VdbeGetOp(pPar
27b0: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
27c0: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 3b  e->addrExplain);
27d0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
27e0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  2;.}../*.** Set 
27f0: 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61 6b  a debugger break
2800: 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f 6c  point on the fol
2810: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
2820: 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f  n order to.** mo
2830: 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41 49  nitor the EXPLAI
2840: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 64  N QUERY PLAN cod
2850: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f  e generation..*/
2860: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2870: 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20  ITE_DEBUG).void 
2880: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2890: 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20 63  eakpoint(const c
28a0: 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63  har *z1, const c
28b0: 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f 69  har *z2){.  (voi
28c0: 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a 32  d)z1;.  (void)z2
28d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28e0: 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 20  * Add a new OP_ 
28f0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
2900: 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67 20   the bPush flag 
2910: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61  is true, then ma
2920: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  ke this opcode t
2930: 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a 2a  he parent for.**
2940: 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70 6c   subsequent Expl
2950: 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69 74  ains until sqlit
2960: 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f 70  e3VdbeExplainPop
2970: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
2980: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2990: 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20 2a  eExplain(Parse *
29a0: 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73 68  pParse, u8 bPush
29b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
29c0: 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65  mt, ...){.#ifnde
29d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29e0: 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c 75   /* Always inclu
29f0: 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61 69  de the OP_Explai
2a00: 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51 4c  n opcodes if SQL
2a10: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
2a20: 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 6f  ined..  ** But o
2a30: 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70 65  mit them (for pe
2a40: 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69 6e  rformance) durin
2a50: 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  g production bui
2a60: 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  lds */.  if( pPa
2a70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
2a80: 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  ).#endif.  {.   
2a90: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
2aa0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61   Vdbe *v;.    va
2ab0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e  _list ap;.    in
2ac0: 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f  t iThis;.    va_
2ad0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b  start(ap, zFmt);
2ae0: 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
2af0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72  te3VMPrintf(pPar
2b00: 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70  se->db, zFmt, ap
2b10: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
2b20: 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  );.    v = pPars
2b30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54  e->pVdbe;.    iT
2b40: 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  his = v->nOp;.  
2b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b60: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
2b70: 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65  n, iThis, pParse
2b80: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30  ->addrExplain, 0
2b90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ba0: 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34          zMsg, P4
2bb0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 73  _DYNAMIC);.    s
2bc0: 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72 65  qlite3ExplainBre
2bd0: 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22 50  akpoint(bPush?"P
2be0: 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65 33  USH":"", sqlite3
2bf0: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
2c00: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20  >p4.z);.    if( 
2c10: 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70 50  bPush){.      pP
2c20: 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69  arse->addrExplai
2c30: 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20 7d  n = iThis;.    }
2c40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
2c50: 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  p the EXPLAIN QU
2c60: 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20 6f  ERY PLAN stack o
2c70: 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69  ne level..*/.voi
2c80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2c90: 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a 70  lainPop(Parse *p
2ca0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
2cb0: 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f 69  3ExplainBreakpoi
2cc0: 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20 20  nt("POP", 0);.  
2cd0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
2ce0: 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ain = sqlite3Vdb
2cf0: 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70  eExplainParent(p
2d00: 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66  Parse);.}.#endif
2d10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2d20: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  EXPLAIN */../*.*
2d30: 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73  * Add an OP_Pars
2d40: 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20  eSchema opcode. 
2d50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2d60: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
2d70: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
2d80: 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74  ddOp4() since it
2d90: 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e   needs to also n
2da0: 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c  eeds to mark all
2db0: 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61   btrees.** as ha
2dc0: 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a  ving been used..
2dd0: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65  **.** The zWhere
2de0: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76   string must hav
2df0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
2e00: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
2e10: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72  loc()..** This r
2e20: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65  outine will take
2e30: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
2e40: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
2e50: 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ry..*/.void sqli
2e60: 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
2e70: 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c  chemaOp(Vdbe *p,
2e80: 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a   int iDb, char *
2e90: 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a  zWhere){.  int j
2ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2eb0: 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp4(p, OP_Pars
2ec0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
2ed0: 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44   0, zWhere, P4_D
2ee0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
2ef0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
2f00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
2f10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
2f20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
2f30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2f40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
2f50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
2f60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2f70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2f80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
2f90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2fa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
2fb0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
2fe0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
2ff0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
3000: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
3010: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
3020: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
3030: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
3040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3050: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
3060: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3080: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
3090: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
30a0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
30b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
30c0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
30d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
30e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
30f0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
3100: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3110: 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  ];.    pOp->p4ty
3120: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
3130: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70     pOp->p4.i = p
3140: 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  4;.  }.  return 
3150: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65  addr;.}../* Inse
3160: 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  rt the end of a 
3170: 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f  co-routine.*/.vo
3180: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
3190: 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20  dCoroutine(Vdbe 
31a0: 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64  *v, int regYield
31b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
31c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
31d0: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
31e0: 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  eld);..  /* Clea
31f0: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
3200: 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20  register cache, 
3210: 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67  thereby ensuring
3220: 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20   that each.  ** 
3230: 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69  co-routine has i
3240: 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65  ts own independe
3250: 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74  nt set of regist
3260: 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d  ers, because co-
3270: 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69  routines.  ** mi
3280: 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72  ght expect their
3290: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65   registers to be
32a0: 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73   preserved acros
32b0: 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61  s an OP_Yield, a
32c0: 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75  nd.  ** that cou
32d0: 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d  ld cause problem
32e0: 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s if two or more
32f0: 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65   co-routines are
3300: 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
3310: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72    ** temporary r
3320: 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  egister..  */.  
3330: 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  v->pParse->nTemp
3340: 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50  Reg = 0;.  v->pP
3350: 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
3360: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 0;.}../*.** Cr
3370: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
3380: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
3390: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
33a0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
33b0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
33c0: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
33d0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
33e0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
33f0: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
3400: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
3410: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
3420: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
3430: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
3440: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
3450: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
3460: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
3470: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
3480: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
3490: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
34a0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
34b0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
34c0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
34d0: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
34e0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
34f0: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
3500: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
3510: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
3520: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
3530: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
3540: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
3550: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
3560: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
3570: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
3580: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
3590: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
35a0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
35b0: 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20 54  d..** (Later:) T
35c0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 74 72 75 65  his is only true
35d0: 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 74 68 61   for opcodes tha
35e0: 74 20 68 61 76 65 20 74 68 65 20 4f 50 46 4c 47  t have the OPFLG
35f0: 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70 65 72 74  _JUMP.** propert
3600: 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  y..**.** Variabl
3610: 65 20 75 73 61 67 65 20 6e 6f 74 65 73 3a 0a 2a  e usage notes:.*
3620: 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 61  *.**     Parse.a
3630: 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20 53 74 6f  Label[x]     Sto
3640: 72 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20  res the address 
3650: 74 68 61 74 20 74 68 65 20 78 2d 74 68 20 6c 61  that the x-th la
3660: 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a 2a 2a 20  bel resolves.** 
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 20 20 20 20 20 69 6e 74 6f 2e 20 20 46          into.  F
3690: 6f 72 20 74 65 73 74 69 6e 67 20 28 53 51 4c 49  or testing (SQLI
36a0: 54 45 5f 44 45 42 55 47 29 2c 20 75 6e 72 65 73  TE_DEBUG), unres
36b0: 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  olved.**        
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 6c 61 62 65 6c 73 20 73 74 6f 72 65 73 20 2d   labels stores -
36e0: 31 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  1, but that is n
36f0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ot required..** 
3700: 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65 6c      Parse.nLabel
3710: 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65 72 20 6f  Alloc   Number o
3720: 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65  f slots allocate
3730: 64 20 74 6f 20 50 61 72 73 65 2e 61 4c 61 62 65  d to Parse.aLabe
3740: 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61 72 73 65  l[].**     Parse
3750: 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20 20 20 54  .nLabel        T
3760: 68 65 20 2a 6e 65 67 61 74 69 76 65 2a 20 6f 66  he *negative* of
3770: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3780: 61 62 65 6c 73 20 74 68 61 74 20 68 61 76 65 0a  abels that have.
3790: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
37a0: 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
37b0: 69 73 73 75 65 64 2e 20 20 54 68 65 20 6e 65 67  issued.  The neg
37c0: 61 74 69 76 65 20 69 73 20 73 74 6f 72 65 64 20  ative is stored 
37d0: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 20  because.**      
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 20 20 74 68 61 74 20 67 69 76 65 73 20 61 20     that gives a 
3800: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
3810: 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 73 74 6f  ovement over sto
3820: 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 70  the equivalent p
3850: 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 0a 2a  ositive value..*
3860: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3870: 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61 72 73 65  eMakeLabel(Parse
3880: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 72 65 74   *pParse){.  ret
3890: 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c  urn --pParse->nL
38a0: 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  abel;.}../*.** R
38b0: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
38c0: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
38d0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
38e0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
38f0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
3900: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
3910: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
3920: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
3930: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
3940: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
3950: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74  Label()..*/.stat
3960: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
3970: 4e 45 20 76 6f 69 64 20 72 65 73 69 7a 65 52 65  NE void resizeRe
3980: 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61 72 73 65  solveLabel(Parse
3990: 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e   *p, Vdbe *v, in
39a0: 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e 4e 65 77  t j){.  int nNew
39b0: 53 69 7a 65 20 3d 20 31 30 20 2d 20 70 2d 3e 6e  Size = 10 - p->n
39c0: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62  Label;.  p->aLab
39d0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
39e0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
39f0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a10: 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73 69 7a 65     nNewSize*size
3a20: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
3a30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
3a40: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  el==0 ){.    p->
3a50: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b  nLabelAlloc = 0;
3a60: 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
3a70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
3a80: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
3a90: 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  (i=p->nLabelAllo
3aa0: 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65 3b 20 69  c; i<nNewSize; i
3ab0: 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d  ++) p->aLabel[i]
3ac0: 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20   = -1;.#endif.  
3ad0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
3ae0: 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a 20 20 20   = nNewSize;.   
3af0: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
3b00: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f  v->nOp;.  }.}.vo
3b10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
3b20: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
3b30: 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61  *v, int x){.  Pa
3b40: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
3b50: 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44  se;.  int j = AD
3b60: 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28  DR(x);.  assert(
3b70: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
3b80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3b90: 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c  assert( j<-p->nL
3ba0: 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  abel );.  assert
3bb0: 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66  ( j>=0 );.#ifdef
3bc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
3bd0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
3be0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
3bf0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3c00: 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56 45 20  printf("RESOLVE 
3c10: 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64 5c 6e  LABEL %d to %d\n
3c20: 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20  ", x, v->nOp);. 
3c30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
3c40: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b  p->nLabelAlloc +
3c50: 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20 30 20 29   p->nLabel < 0 )
3c60: 7b 0a 20 20 20 20 72 65 73 69 7a 65 52 65 73 6f  {.    resizeReso
3c70: 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c 6a 29 3b  lveLabel(p,v,j);
3c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3c90: 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c 5b  sert( p->aLabel[
3ca0: 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 4c  j]==(-1) ); /* L
3cb0: 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20 62  abels may only b
3cc0: 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65 20  e resolved once 
3cd0: 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  */.    p->aLabel
3ce0: 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  [j] = v->nOp;.  
3cf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
3d00: 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20  the VDBE as one 
3d10: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  that can only be
3d20: 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a   run one time..*
3d30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3d40: 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64  beRunOnlyOnce(Vd
3d50: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3d60: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a  OnlyOnce = 1;.}.
3d70: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3d80: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3d90: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3da0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
3db0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3dc0: 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64 62  VdbeReusable(Vdb
3dd0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f  e *p){.  p->runO
3de0: 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a  nlyOnce = 0;.}..
3df0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
3e00: 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73  BUG /* sqlite3As
3e10: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c  sertMayAbort() l
3e20: 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ogic */../*.** T
3e30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
3e40: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61  e and function a
3e50: 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  re used to itera
3e60: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  te through all o
3e70: 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56  pcodes.** in a V
3e80: 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  dbe main program
3e90: 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65   and each of the
3ea0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74   sub-programs (t
3eb0: 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20  riggers) it may 
3ec0: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63  .** invoke direc
3ed0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
3ee0: 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  y. It should be 
3ef0: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
3f00: 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70  .**.**   Op *pOp
3f10: 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65  ;.**   VdbeOpIte
3f20: 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20  r sIter;.**.**  
3f30: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
3f40: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
3f50: 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20  );.**   sIter.v 
3f60: 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  = v;            
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20  // v is of type 
3f90: 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c  Vdbe* .**   whil
3fa0: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
3fb0: 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b  Next(&sIter)) ){
3fc0: 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f  .**     // Do so
3fd0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70  mething with pOp
3fe0: 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c  .**   }.**   sql
3ff0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
4000: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
4010: 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ** .*/.typedef s
4020: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
4030: 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72   VdbeOpIter;.str
4040: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b  uct VdbeOpIter {
4050: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4070: 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65   Vdbe to iterate
4080: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63   through the opc
4090: 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62  odes of */.  Sub
40a0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b  Program **apSub;
40b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
40c0: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20   of subprograms 
40d0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20  */.  int nSub;  
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
4100: 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f  ries in apSub */
4110: 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20  .  int iAddr;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4130: 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
4140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4150: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
4160: 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  iSub;           
4170: 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61         /* 0 = ma
4180: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20  in program, 1 = 
4190: 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61  first sub-progra
41a0: 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61  m etc. */.};.sta
41b0: 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65  tic Op *opIterNe
41c0: 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70  xt(VdbeOpIter *p
41d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
41e0: 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20  ->v;.  Op *pRet 
41f0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a  = 0;.  Op *aOp;.
4200: 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66    int nOp;..  if
4210: 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53  ( p->iSub<=p->nS
4220: 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70  ub ){..    if( p
4230: 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20  ->iSub==0 ){.   
4240: 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b     aOp = v->aOp;
4250: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e  .      nOp = v->
4260: 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nOp;.    }else{.
4270: 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61        aOp = p->a
4280: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
4290: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
42a0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
42b0: 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub-1]->nOp;.    
42c0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
42d0: 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20  >iAddr<nOp );.. 
42e0: 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70     pRet = &aOp[p
42f0: 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d  ->iAddr];.    p-
4300: 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66  >iAddr++;.    if
4310: 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20  ( p->iAddr==nOp 
4320: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62  ){.      p->iSub
4330: 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64  ++;.      p->iAd
4340: 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  dr = 0;.    }.  
4350: 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70  .    if( pRet->p
4360: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
4370: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e  GRAM ){.      in
4380: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
4390: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
43a0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
43b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
43c0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62  r(j=0; j<p->nSub
43d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
43e0: 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d  if( p->apSub[j]=
43f0: 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72  =pRet->p4.pProgr
4400: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
4410: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
4420: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20  =p->nSub ){.    
4430: 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73      p->apSub = s
4440: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
4450: 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e  rFree(v->db, p->
4460: 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20  apSub, nByte);. 
4470: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61         if( !p->a
4480: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
4490: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
44a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
44b0: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d       p->apSub[p-
44c0: 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d  >nSub++] = pRet-
44d0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
44e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
44f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
4500: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
4510: 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
4520: 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
4530: 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61  n the VM associa
4540: 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20  ted with pParse 
4550: 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  may.** throw an 
4560: 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20  ABORT exception 
4570: 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61  (causing the sta
4580: 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  tement, but not 
4590: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
45a0: 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c  on.** to be roll
45b0: 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63  ed back). This c
45c0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
45d0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   if the main pro
45e0: 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73  gram or any.** s
45f0: 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74  ub-programs cont
4600: 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20  ains any of the 
4610: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
4620: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69     *  OP_Halt wi
4630: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
4640: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
4650: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
4660: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77   OP_HaltIfNull w
4670: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4680: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4690: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
46a0: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
46b0: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
46c0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
46d0: 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b  me.**   *  OP_Fk
46e0: 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d  Counter with P2=
46f0: 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  =0 (immediate fo
4700: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
4710: 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50  aint).**   *  OP
4720: 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54 52  _CreateBtree/BTR
4730: 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50  EE_INTKEY and OP
4740: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a  _InitCoroutine .
4750: 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52 45  **      (for CRE
4760: 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c  ATE TABLE AS SEL
4770: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
4780: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
4790: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
47a0: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
47b0: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
47c0: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
47d0: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
47e0: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
47f0: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
4800: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
4810: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
4820: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
4830: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
4840: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
4850: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
4860: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
4870: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
4880: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
4890: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
48a0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
48b0: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
48c0: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
48d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
48e0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
48f0: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
4900: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
4910: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ort = 0;.  int h
4920: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b  asFkCounter = 0;
4930: 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65  .  int hasCreate
4940: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
4950: 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 20   hasCreateIndex 
4960: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e  = 0;.  int hasIn
4970: 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  itCoroutine = 0;
4980: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
4990: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
49a0: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
49b0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
49c0: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
49d0: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
49e0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
49f0: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
4a00: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
4a10: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
4a20: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
4a30: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
4a40: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
4a50: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
4a60: 6d 65 20 0a 20 20 20 20 20 7c 7c 20 6f 70 63 6f  me .     || opco
4a70: 64 65 3d 3d 4f 50 5f 56 44 65 73 74 72 6f 79 0a  de==OP_VDestroy.
4a80: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
4a90: 3d 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20  =OP_ParseSchema 
4aa0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 29  && pOp->p4.z==0)
4ab0: 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64  .     || ((opcod
4ac0: 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70  e==OP_Halt || op
4ad0: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e  code==OP_HaltIfN
4ae0: 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28  ull) .      && (
4af0: 28 70 4f 70 2d 3e 70 31 29 21 3d 53 51 4c 49 54  (pOp->p1)!=SQLIT
4b00: 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 32 3d  E_OK && pOp->p2=
4b10: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
4b20: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
4b30: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
4b40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
4b50: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65  ( opcode==OP_Cre
4b60: 61 74 65 42 74 72 65 65 20 26 26 20 70 4f 70 2d  ateBtree && pOp-
4b70: 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45  >p3==BTREE_INTKE
4b80: 59 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62  Y ) hasCreateTab
4b90: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  le = 1;.    if( 
4ba0: 6d 61 79 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  mayAbort ){.    
4bb0: 20 20 2f 2a 20 68 61 73 43 72 65 61 74 65 49 6e    /* hasCreateIn
4bc0: 64 65 78 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  dex may also be 
4bd0: 73 65 74 20 66 6f 72 20 73 6f 6d 65 20 44 45 4c  set for some DEL
4be0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ETE statements t
4bf0: 68 61 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  hat use.      **
4c00: 20 4f 50 5f 43 6c 65 61 72 2e 20 53 6f 20 74 68   OP_Clear. So th
4c10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 65  is routine may e
4c20: 6e 64 20 75 70 20 72 65 74 75 72 6e 69 6e 67 20  nd up returning 
4c30: 74 72 75 65 20 69 6e 20 74 68 65 20 63 61 73 65  true in the case
4c40: 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65   .      ** where
4c50: 20 61 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   a "DELETE FROM 
4c60: 74 62 6c 22 20 68 61 73 20 61 20 73 74 61 74 65  tbl" has a state
4c70: 6d 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 62 75 74  ment-journal but
4c80: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
4c90: 2a 2a 20 72 65 71 75 69 72 65 20 6f 6e 65 2e 20  ** require one. 
4ca0: 54 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 62  This is not so b
4cb0: 61 64 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e  ad - it is an in
4cc0: 65 66 66 69 63 69 65 6e 63 79 2c 20 6e 6f 74 20  efficiency, not 
4cd0: 61 20 62 75 67 2e 20 2a 2f 0a 20 20 20 20 20 20  a bug. */.      
4ce0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  if( opcode==OP_C
4cf0: 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70 4f  reateBtree && pO
4d00: 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 42 4c 4f  p->p3==BTREE_BLO
4d10: 42 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  BKEY ) hasCreate
4d20: 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Index = 1;.     
4d30: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4d40: 43 6c 65 61 72 20 29 20 68 61 73 43 72 65 61 74  Clear ) hasCreat
4d50: 65 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  eIndex = 1;.    
4d60: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
4d70: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
4d80: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
4d90: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
4da0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
4db0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
4dc0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
4dd0: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
4de0: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
4df0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
4e00: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
4e10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4e20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e30: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
4e40: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
4e50: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
4e60: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
4e70: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
4e80: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
4e90: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
4ea0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
4eb0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
4ec0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
4ed0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
4ee0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
4ef0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
4f00: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
4f10: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
4f20: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
4f30: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
4f40: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
4f50: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
4f60: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
4f70: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
4f80: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
4f90: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
4fa0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
4fb0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
4fc0: 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65        || (hasCre
4fd0: 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49  ateTable && hasI
4fe0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 7c 7c  nitCoroutine) ||
4ff0: 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 0a   hasCreateIndex.
5000: 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a    );.}.#endif /*
5010: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
5020: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
5030: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
5040: 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  tion */..#ifdef 
5050: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
5060: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
5070: 20 6e 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20   nWrite counter 
5080: 69 6e 20 74 68 65 20 56 44 42 45 20 69 66 20 74  in the VDBE if t
5090: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
50a0: 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c   an.** ephemeral
50b0: 20 63 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74   cursor, or if t
50c0: 68 65 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65  he cursor argume
50d0: 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76  nt is NULL..*/.v
50e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
50f0: 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28  ncrWriteCounter(
5100: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
5110: 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20  sor *pC){.  if( 
5120: 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d  pC==0.   || (pC-
5130: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
5140: 50 45 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20  PE_SORTER.      
5150: 20 26 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65   && pC->eCurType
5160: 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  !=CURTYPE_PSEUDO
5170: 0a 20 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e  .       && !pC->
5180: 69 73 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29  isEphemeral).  )
5190: 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b  {.    p->nWrite+
51a0: 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  +;.  }.}.#endif.
51b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
51c0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72  EBUG./*.** Asser
51d0: 74 20 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74  t if an Abort at
51e0: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
51f0: 69 6d 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ime might result
5200: 20 69 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a   in a corrupt.**
5210: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
5220: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  id sqlite3VdbeAs
5230: 73 65 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64  sertAbortable(Vd
5240: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5250: 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c  ( p->nWrite==0 |
5260: 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  | p->usesStmtJou
5270: 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  rnal );.}.#endif
5280: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5290: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
52a0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
52b0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
52c0: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
52d0: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
52e0: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
52f0: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
5300: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
5310: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
5320: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
5330: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
5340: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
5350: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
5360: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
5370: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
5380: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
5390: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
53a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
53b0: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
53c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
53d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
53e0: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
53f0: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
5400: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
5410: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
5420: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
5430: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
5440: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
5450: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
5460: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
5470: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
5480: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
5490: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
54a0: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
54b0: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
54c0: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
54d0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
54e0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
54f0: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a  ing labels..**.*
5500: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
5510: 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  ill only functio
5520: 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74  n correctly if t
5530: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5540: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63   generator.** sc
5550: 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65  ript numbers the
5560: 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74   opcodes correct
5570: 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20  ly.  Changes to 
5580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
5590: 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  t be.** coordina
55a0: 74 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73  ted with changes
55b0: 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63   to mkopcodeh.tc
55c0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
55d0: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
55e0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
55f0: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
5600: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
5610: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
5620: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
5630: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
5640: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
5650: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
5660: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
5670: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
5680: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
5690: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
56a0: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65  >nOp-1];.  while
56b0: 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  (1){..    /* Onl
56c0: 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61  y JUMP opcodes a
56d0: 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73  nd the short lis
56e0: 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63  t of special opc
56f0: 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74  odes in the swit
5700: 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20  ch.    ** below 
5710: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
5720: 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70  dered.  The mkop
5730: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5740: 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70  tor script group
5750: 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  s.    ** all the
5760: 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74  se opcodes toget
5770: 68 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f  her near the fro
5780: 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nt of the opcode
5790: 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20   list.  Skip.   
57a0: 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74   ** any opcode t
57b0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
57c0: 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  d processing by 
57d0: 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66  virtual of the f
57e0: 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
57f0: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
5800: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5810: 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65  _OPCODE, as a pe
5820: 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
5830: 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
5840: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
5850: 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  de<=SQLITE_MX_JU
5860: 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20  MP_OPCODE ){.   
5870: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
5880: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
5890: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e  opcodeh.tcl when
58a0: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
58b0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  ing.      ** cas
58c0: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
58d0: 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77  tch! */.      sw
58e0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
58f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
5900: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
5910: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5920: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
5930: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c            /* fal
5950: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
5960: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5970: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
5980: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5990: 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20  Savepoint: {.   
59a0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
59b0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
59c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
59d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
59e0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
59f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
5a00: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
5a10: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5a20: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63  acuum:.        c
5a30: 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
5a40: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  de: {.          
5a50: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
5a60: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
5a70: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
5a80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5aa0: 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20  case OP_Next:.  
5ab0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
5ac0: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
5ad0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
5ae0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
5af0: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
5b00: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5b10: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
5b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5b30: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
5b40: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
5b50: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
5b60: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
5b70: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
5b80: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
5b90: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
5ba0: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
5bb0: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
5bc0: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
5bd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
5be0: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
5bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5c00: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5c10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
5c20: 76 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v: {.          p
5c30: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
5c40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
5c50: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
5c60: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5c70: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
5c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
5c90: 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65  e generator neve
5ca0: 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74  r codes any of t
5cb0: 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20  hese opcodes as 
5cc0: 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20  a jump.         
5cd0: 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20   ** to a label. 
5ce0: 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
5cf0: 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70   coded as a jump
5d00: 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20   backwards to a 
5d10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e  .          ** kn
5d20: 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  own address */. 
5d30: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5d40: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
5d50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5d60: 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65          }.#ifnde
5d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
5d80: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
5d90: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
5da0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  te: {.          
5db0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
5dc0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
5dd0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
5de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5e00: 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b  se OP_VFilter: {
5e10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
5e20: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
5e30: 72 74 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f  rt( (pOp - p->aO
5e40: 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20  p) >= 3 );.     
5e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5e60: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
5e70: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
5e80: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
5e90: 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  .p1;.          i
5ea0: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
5eb0: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
5ec0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
5ed0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65  through into the
5ee0: 20 64 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f   default case */
5ef0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
5f00: 66 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  f.        defaul
5f10: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5f20: 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  f( pOp->p2<0 ){.
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5f40: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5f50: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5f60: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5f70: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5f80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d           ** non-
5f90: 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73  jump opcodes les
5fa0: 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  s than SQLITE_MX
5fb0: 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67  _JUMP_CODE are g
5fc0: 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
5fd0: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
5fe0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61   non-negative va
5ff0: 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a  lues for P2. */.
6000: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
6010: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
6020: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
6030: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
6040: 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20  JUMP)!=0 );.    
6050: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6060: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 2d 70  ADDR(pOp->p2)<-p
6070: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
6080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
6090: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44  ->p2 = aLabel[AD
60a0: 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20  DR(pOp->p2)];.  
60b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
60c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
60d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
60e0: 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f     /* The mkopco
60f0: 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68  deh.tcl script h
6100: 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74  as so arranged t
6110: 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f  hings that the o
6120: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e  nly.      ** non
6130: 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65  -jump opcodes le
6140: 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  ss than SQLITE_M
6150: 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20  X_JUMP_CODE are 
6160: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
6170: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
6180: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
6190: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
61a0: 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65   assert( (sqlite
61b0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
61c0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46  pOp->opcode]&OPF
61d0: 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70  LG_JUMP)==0 || p
61e0: 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20  Op->p2>=0);.    
61f0: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70  }.    if( pOp==p
6200: 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20  ->aOp ) break;. 
6210: 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20     pOp--;.  }.  
6220: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
6230: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
6240: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
6250: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
6260: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
6270: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
6280: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
6290: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
62a0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
62b0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
62c0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
62d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
62e0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
62f0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
6300: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
6310: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
6320: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
6330: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
6340: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6350: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
6360: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
6370: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
6380: 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70  at at least N op
6390: 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61  code slots are a
63a0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69  vailable in p wi
63b0: 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20  thout.** having 
63c0: 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f  to malloc for mo
63d0: 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70 74  re space (except
63e0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   when compiled u
63f0: 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  sing.** SQLITE_T
6400: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6410: 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72  SS).  This inter
6420: 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75 72  face is used dur
6430: 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74  ing testing.** t
6440: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63 65  o verify that ce
6450: 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73  rtain calls to s
6460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6470: 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a  ist() can never.
6480: 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61  ** fail due to a
6490: 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68   OOM fault and h
64a0: 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72 65  ence that the re
64b0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a  turn value from.
64c0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
64d0: 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61  dOpList() will a
64e0: 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c  lways be non-NUL
64f0: 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  L..*/.#if define
6500: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
6510: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6520: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
6530: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
6540: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
6550: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56  MallocRequired(V
6560: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
6570: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6580: 20 2b 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c   + N <= p->nOpAl
6590: 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  loc );.}.#endif.
65a0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
65b0: 61 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  at the VM passed
65c0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
65d0: 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63  ument does not c
65e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f  ontain.** an OP_
65f0: 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
6600: 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74  . Fail an assert
6610: 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54  () if it does. T
6620: 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62  his is used.** b
6630: 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61  y code in pragma
6640: 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  .c to ensure tha
6650: 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  t the implementa
6660: 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a  tion of certain.
6670: 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f  ** pragmas compo
6680: 72 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61  rts with the fla
6690: 67 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  gs specified in 
66a0: 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e  the mkpragmatab.
66b0: 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a  tcl.** script..*
66c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
66d0: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21  LITE_DEBUG) && !
66e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
66f0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6700: 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  SS).void sqlite3
6710: 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
6720: 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a  ltRow(Vdbe *p){.
6730: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6740: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
6750: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
6760: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
6770: 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29  !=OP_ResultRow )
6780: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6790: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
67a0: 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20 4f 50  ode (a single OP
67b0: 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f 64  _Abortable opcod
67c0: 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20  e) that will.** 
67d0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
67e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63 61 6e  VDBE program can
67f0: 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41 62 6f   safely call Abo
6800: 72 74 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rt in the curren
6810: 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f  t.** context..*/
6820: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6830: 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20  ITE_DEBUG).void 
6840: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
6850: 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20  yAbortable(Vdbe 
6860: 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  *p, int onError)
6870: 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  {.  if( onError=
6880: 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71 6c 69  =OE_Abort ) sqli
6890: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
68a0: 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b 0a   OP_Abortable);.
68b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
68c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
68d0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
68e0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
68f0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
6900: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
6910: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
6920: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6930: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
6940: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
6950: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
6960: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
6970: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
6980: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
6990: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
69a0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
69b0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
69c0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
69d0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
69e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
69f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
6a00: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
6a10: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
6a20: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
6a30: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
6a40: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
6a50: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
6a60: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6a70: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
6a80: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
6a90: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
6aa0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
6ab0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
6ac0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
6ad0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
6ae0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
6af0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
6b00: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
6b10: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
6b20: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
6b30: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
6b40: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
6b50: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
6b60: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
6b70: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
6b80: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
6b90: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
6ba0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
6bb0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
6bc0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
6bd0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
6be0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
6bf0: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
6c00: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
6c10: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
6c20: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
6c30: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
6c40: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
6c50: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
6c60: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
6c70: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
6c80: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
6c90: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
6ca0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
6cb0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
6cc0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
6cd0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
6ce0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
6cf0: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
6d00: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6d10: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
6d20: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d40: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
6d50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6d60: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
6d70: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
6d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6d90: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
6da0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
6db0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
6dc0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
6dd0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
6de0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
6df0: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
6e00: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
6e10: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
6e20: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
6e30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
6e40: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
6e50: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
6e60: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
6e70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6e80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6e90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
6ea0: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
6eb0: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
6ec0: 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20  y(p, nOp) ){.   
6ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6ee0: 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d   pFirst = pOut =
6ef0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d   &p->aOp[p->nOp]
6f00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
6f10: 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20  Op; i++, aOp++, 
6f20: 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75  pOut++){.    pOu
6f30: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d  t->opcode = aOp-
6f40: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75  >opcode;.    pOu
6f50: 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b  t->p1 = aOp->p1;
6f60: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20  .    pOut->p2 = 
6f70: 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73  aOp->p2;.    ass
6f80: 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20  ert( aOp->p2>=0 
6f90: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
6fa0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
6fb0: 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[aOp->opcode] &
6fc0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
6fd0: 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  && aOp->p2>0 ){.
6fe0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b        pOut->p2 +
6ff0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
7000: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
7010: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
7020: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
7030: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
7040: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
7050: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
7060: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7070: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7080: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
7090: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
70a0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
70b0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
70c0: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
70d0: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
70e0: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
70f0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
7100: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7110: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
7120: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7130: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
7140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7150: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
7160: 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b  p->nOp, &p->aOp[
7170: 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20  i+p->nOp]);.    
7180: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
7190: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
71a0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
71b0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
71c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
71d0: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
71e0: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
71f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
7200: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
7210: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
7220: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
7230: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7240: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
7250: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
7280: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
7290: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
72a0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
72b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
72c0: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
72d0: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
72e0: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
72f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
7300: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
7310: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
7320: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
7330: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
7340: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
7350: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
7360: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
7390: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
73a0: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
73b0: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
73c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
73d0: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
73e0: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
73f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
7400: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 70  int64 nByte = (p
7410: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
7420: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
7430: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
7440: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
7450: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
7460: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
7470: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
7480: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
7490: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
74a0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
74b0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
74c0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
74d0: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
74e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
74f0: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
7500: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
7510: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
7520: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
7530: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
7540: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
7550: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
7560: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
7570: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
7580: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
7590: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
75a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
75b0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
75c0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
75d0: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
75e0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
75f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7600: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
7610: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
7620: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
7630: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
7640: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7650: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
7660: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
7670: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
7680: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
7690: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
76a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
76b0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
76c0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
76d0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
76e0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
76f0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
7700: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
7710: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
7720: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7730: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
7740: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
7750: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
7760: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
7770: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
7780: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7790: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
77a0: 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73  p, u16 p5){.  as
77b0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
77c0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
77d0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
77e0: 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70  ->nOp>0 ) p->aOp
77f0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
7800: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p5;.}../*.** Cha
7810: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
7820: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
7830: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
7840: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
7850: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
7860: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
7870: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
7880: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7890: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
78a0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
78b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
78c0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
78d0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
78e0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
78f0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
7900: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
7910: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
7920: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
7930: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
7940: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
7950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7960: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
7970: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
7980: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
7990: 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d  f){.  if( (pDef-
79a0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
79b0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
79c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
79d0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44  3DbFreeNN(db, pD
79e0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
79f0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
7a00: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
7a10: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
7a20: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
7a30: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
7a40: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
7a50: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7a60: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
7a70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
7a80: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
7a90: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
7aa0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
7ab0: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
7ac0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
7ad0: 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54  ;.}.static SQLIT
7ae0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7af0: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71  freeP4FuncCtx(sq
7b00: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
7b10: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  e3_context *p){.
7b20: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7b30: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70  unction(db, p->p
7b40: 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44  Func);. sqlite3D
7b50: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
7b60: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
7b70: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
7b80: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
7b90: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
7ba0: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
7bb0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
7bc0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
7bd0: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
7be0: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
7bf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
7c00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7c10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7c20: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
7c30: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
7c40: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
7c50: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
7c60: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
7c70: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7c80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7c90: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
7ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7cb0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
7cc0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7cd0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7ce0: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
7cf0: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
7d00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7d10: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
7d20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7d30: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
7d40: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
7d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7d60: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
7d70: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  r*)p4);.      br
7d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7d90: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  f.    case P4_FU
7da0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66  NCDEF: {.      f
7db0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
7dc0: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
7dd0: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  f*)p4);.      br
7de0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7df0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7e00: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7e10: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
7e20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
7e30: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
7e40: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
7e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e60: 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20    freeP4Mem(db, 
7e70: 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20  (Mem*)p4);.     
7e80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7ea0: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
7eb0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7ec0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
7ed0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
7ee0: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
7ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7f00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
7f10: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
7f20: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
7f30: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
7f40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
7f50: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
7f60: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
7f70: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
7f80: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
7f90: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
7fa0: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
7fb0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7fc0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
7fd0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
7fe0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
7ff0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
8000: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
8010: 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f  =&aOp[nOp-1]; pO
8020: 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a  p>=aOp; pOp--){.
8030: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
8040: 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45  4type <= P4_FREE
8050: 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28  _IF_LE ) freeP4(
8060: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
8070: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
8080: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8090: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
80a0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
80b0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
80c0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
80d0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
80e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
80f0: 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d  (db, aOp);.  }.}
8100: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
8110: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
8120: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
8130: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8140: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
8150: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
8160: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
8170: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
8180: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
8190: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
81a0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
81b0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
81c0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
81d0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
81e0: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
81f0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
8200: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
8210: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
8220: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
8230: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
8240: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
8250: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 56 64   if the given Vd
8260: 62 65 20 68 61 73 20 61 6e 79 20 53 75 62 50 72  be has any SubPr
8270: 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ograms..*/.int s
8280: 71 6c 69 74 65 33 56 64 62 65 48 61 73 53 75 62  qlite3VdbeHasSub
8290: 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56  Program(Vdbe *pV
82a0: 64 62 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  dbe){.  return p
82b0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 21 3d  Vdbe->pProgram!=
82c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0;.}../*.** Chan
82d0: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
82e0: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
82f0: 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  op.*/.int sqlite
8300: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
8310: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
8320: 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  ddr){.  VdbeOp *
8330: 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  pOp;.  if( p->db
8340: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
8360: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20  ert( addr>=0 && 
8370: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
8380: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
8390: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70  ddr];.  freeP4(p
83a0: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
83b0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
83c0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
83d0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70  4_NOTUSED;.  pOp
83e0: 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.z = 0;.  pO
83f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
8400: 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  oop;.  return 1;
8410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
8420: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20   last opcode is 
8430: 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e  "op" and it is n
8440: 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ot a jump destin
8450: 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72  ation,.** then r
8460: 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72  emove it.  Retur
8470: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
8480: 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20  ly if an opcode 
8490: 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  was removed..*/.
84a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44  int sqlite3VdbeD
84b0: 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65  eletePriorOpcode
84c0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29  (Vdbe *p, u8 op)
84d0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  {.  if( p->nOp>0
84e0: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
84f0: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
8500: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
8510: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
8520: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
8530: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
8540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
8550: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
8560: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
8570: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
8580: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
8590: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
85a0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
85b0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
85c0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
85d0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
85e0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
85f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
8600: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
8610: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
8620: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
8630: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
8640: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
8650: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
8660: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
8670: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
8680: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
8690: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
86a0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
86b0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
86c0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
86d0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
86e0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
86f0: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
8700: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
8710: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
8720: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
8730: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
8740: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
8750: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
8760: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
8770: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
8780: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
8790: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
87a0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
87b0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
87c0: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
87d0: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
87e0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
87f0: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
8800: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
8810: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
8820: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
8830: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8840: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
8850: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
8860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
8870: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62  ITE_NOINLINE vdb
8880: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20  eChangeP4Full(. 
8890: 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a   Vdbe *p,.  Op *
88a0: 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pOp,.  const cha
88b0: 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a  r *zP4,.  int n.
88c0: 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  ){.  if( pOp->p4
88d0: 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65  type ){.    free
88e0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
88f0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
8900: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
8910: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  pe = 0;.    pOp-
8920: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  >p4.p = 0;.  }. 
8930: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8940: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8950: 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70  eP4(p, (int)(pOp
8960: 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c   - p->aOp), zP4,
8970: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
8980: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
8990: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
89a0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
89b0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
89c0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
89d0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
89e0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
89f0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  AMIC;.  }.}.void
8a00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8a10: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
8a20: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
8a30: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
8a40: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
8a50: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
8a60: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
8a70: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
8a80: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8a90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
8ab0: 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op!=0 || db->mal
8ac0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
8ad0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
8ae0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
8af0: 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65  !=P4_VTAB ) free
8b00: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
8b10: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
8b20: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8b30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
8b40: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
8b50: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
8b60: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
8b70: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
8b80: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
8b90: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
8ba0: 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20  ;.  if( n>=0 || 
8bb0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
8bc0: 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46     vdbeChangeP4F
8bd0: 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c  ull(p, pOp, zP4,
8be0: 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   n);.    return;
8bf0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34  .  }.  if( n==P4
8c00: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
8c10: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
8c20: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
8c30: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
8c40: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
8c50: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
8c60: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
8c70: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
8c80: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
8c90: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
8ca0: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
8cb0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
8cc0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
8cd0: 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  zP4!=0 ){.    as
8ce0: 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20  sert( n<0 );.   
8cf0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
8d00: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
8d10: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
8d20: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69  ed char)n;.    i
8d30: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20  f( n==P4_VTAB ) 
8d40: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
8d50: 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20  (VTable*)zP4);. 
8d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8d70: 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  ge the P4 operan
8d80: 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
8d90: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
8da0: 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20  truction .** to 
8db0: 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65  the value define
8dc0: 64 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e  d by the argumen
8dd0: 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 20 68  ts.  This is a h
8de0: 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72  igh-speed.** ver
8df0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
8e00: 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a  dbeChangeP4()..*
8e10: 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72  *.** The P4 oper
8e20: 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76  and must not hav
8e30: 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  e been previousl
8e40: 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20  y defined.  And 
8e50: 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75  the new.** P4 mu
8e60: 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54  st not be P4_INT
8e70: 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33  32.  Use sqlite3
8e80: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 69  VdbeChangeP4() i
8e90: 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74  n either of.** t
8ea0: 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76  hose cases..*/.v
8eb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
8ec0: 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c  ppendP4(Vdbe *p,
8ed0: 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20   void *pP4, int 
8ee0: 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  n){.  VdbeOp *pO
8ef0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d  p;.  assert( n!=
8f00: 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50  P4_INT32 && n!=P
8f10: 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65  4_VTAB );.  asse
8f20: 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66  rt( n<=0 );.  if
8f30: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
8f40: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65  ailed ){.    fre
8f50: 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50  eP4(p->db, n, pP
8f60: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
8f70: 20 61 73 73 65 72 74 28 20 70 50 34 21 3d 30 20   assert( pP4!=0 
8f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8f90: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
8fa0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  Op = &p->aOp[p->
8fb0: 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  nOp-1];.    asse
8fc0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
8fd0: 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20  =P4_NOTUSED );. 
8fe0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
8ff0: 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   n;.    pOp->p4.
9000: 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a  p = pP4;.  }.}..
9010: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34  /*.** Set the P4
9020: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
9030: 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f  ently added opco
9040: 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  de to the KeyInf
9050: 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64  o for the.** ind
9060: 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  ex given..*/.voi
9070: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
9080: 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  P4KeyInfo(Parse 
9090: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
90a0: 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76  pIdx){.  Vdbe *v
90b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
90c0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
90d0: 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28  yInfo;.  assert(
90e0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
90f0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
9100: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
9110: 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
9120: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
9130: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
9140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
9150: 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f  ndP4(v, pKeyInfo
9160: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d  , P4_KEYINFO);.}
9170: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9180: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
9190: 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68  OMMENTS./*.** Ch
91a0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
91b0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
91c0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
91d0: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
91e0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
91f0: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
9200: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
9210: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
9220: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
9230: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
9240: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
9250: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
9260: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
9270: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
9280: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
9290: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
92a0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
92b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
92c0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
92d0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
92e0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
92f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
9300: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
9310: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
9320: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
9330: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
9340: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
9350: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
9360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9370: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
9380: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
9390: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
93a0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
93b0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
93c0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
93d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
93e0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
93f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
9400: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
9410: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
9420: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
9430: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
9440: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
9450: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
9460: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
9470: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
9480: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
9490: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
94a0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
94b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
94c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
94d0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
94e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
94f0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
9500: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
9510: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
9520: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
9530: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
9540: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
9550: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
9560: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
9570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
9580: 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a  BE_COVERAGE./*.*
9590: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
95a0: 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20  if the iSrcLine 
95b0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72  field for the pr
95c0: 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69  eviously coded i
95d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
95e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
95f0: 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62  etLineNumber(Vdb
9600: 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29  e *v, int iLine)
9610: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
9620: 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63  etOp(v,-1)->iSrc
9630: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a  Line = iLine;.}.
9640: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9650: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a  _VDBE_COVERAGE *
9660: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
9670: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
9680: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
9690: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
96a0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
96b0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
96c0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
96d0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
96e0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
96f0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
9700: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
9710: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
9720: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
9730: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
9740: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
9750: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
9760: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
9770: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
9780: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c   but not writabl
9790: 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  e, though it is 
97a0: 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62  cast to a writab
97b0: 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  le value..** The
97c0: 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d   return of a dum
97d0: 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  my opcode allows
97e0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
97f0: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
9800: 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f  g.** after an OO
9810: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
9820: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
9830: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
9840: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
9850: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9860: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
9870: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
9880: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
9890: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
98a0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
98b0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
98c0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
98d0: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
98e0: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
98f0: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
9900: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
9910: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
9920: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
9930: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
9940: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
9950: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
9960: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
9970: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
9980: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
9990: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
99a0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
99b0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
99c0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
99d0: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
99e0: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
99f0: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
9a00: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
9a10: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
9a20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
9a30: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
9a40: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
9a50: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
9a60: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
9a70: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
9a80: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
9a90: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
9aa0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9ab0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9ac0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
9ad0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9ae0: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
9af0: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
9b00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9b10: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
9b20: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
9b30: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
9b40: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
9b50: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
9b60: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
9b70: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
9b80: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
9b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
9ba0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
9bb0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
9bc0: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
9bd0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
9be0: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
9bf0: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
9c00: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
9c10: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
9c20: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
9c30: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
9c40: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
9c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
9c60: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
9c70: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
9c80: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
9c90: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
9ca0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
9cb0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
9cc0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
9cd0: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
9ce0: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
9cf0: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
9d00: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
9d10: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
9d20: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
9d30: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
9d40: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
9d50: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
9d60: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
9d70: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
9d80: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
9d90: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
9da0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
9db0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
9dc0: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
9dd0: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
9de0: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
9df0: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
9e00: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
9e10: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
9e20: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
9e30: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
9e40: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
9e50: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
9e60: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
9e70: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
9e80: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
9e90: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
9ea0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
9eb0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
9ec0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
9ed0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
9ee0: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
9ef0: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
9f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
9f10: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
9f20: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
9f30: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
9f40: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
9f50: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
9f60: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
9f70: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
9f80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
9f90: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
9fa0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
9fb0: 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c  , jj;.  char zAl
9fc0: 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65  t[50];.  zOpName
9fd0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
9fe0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
9ff0: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
a000: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a010: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
a020: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
a030: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
a040: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
a050: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
a060: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
a070: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
a080: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
a090: 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29  ynopsis,"IF ",3)
a0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
a0b0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
a0c0: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
a0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a0e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c  rintf(sizeof(zAl
a0f0: 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d  t), zAlt, "r[P2]
a100: 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70   = (%s)", zSynop
a110: 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65  sis+3);.      }e
a120: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a130: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
a140: 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74  zeof(zAlt), zAlt
a150: 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32  , "if %s goto P2
a160: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
a170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a180: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b  Synopsis = zAlt;
a190: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
a1a0: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
a1b0: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
a1c0: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
a1d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
a1e0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
a1f0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
a200: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
a210: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a230: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a240: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
a250: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
a260: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
a270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a280: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a290: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
a2a0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
a2b0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
a2c0: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
a2d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a2e0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
a2f0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
a300: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
a310: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
a320: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a330: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a340: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
a350: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
a360: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
a370: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
a380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a390: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
a3a0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
a3b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
a3c0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
a3d0: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
a3e0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
a3f0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
a400: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
a410: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
a420: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
a440: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
a450: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
a460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a470: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a490: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a4a0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
a4b0: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
a4c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
a4d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
a4e0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
a4f0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
a500: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
a510: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
a520: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
a530: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a550: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
a560: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
a570: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a580: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
a590: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
a5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
a5b0: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
a5c0: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
a5d0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
a5e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
a5f0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
a600: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
a610: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
a620: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
a630: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
a640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a650: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
a660: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
a670: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
a680: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
a690: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
a6a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
a6b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
a6c0: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
a6d0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
a6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
a6f0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
a700: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
a710: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
a720: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
a730: 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44  G */..#if VDBE_D
a740: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
a750: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
a760: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
a770: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
a780: 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61   the P4.pExpr va
a790: 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75  lue for an OP_Cu
a7a0: 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20  rsorHint opcode 
a7b0: 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61  into text.** tha
a7c0: 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79  t can be display
a7d0: 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c  ed in the P4 col
a7e0: 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f  umn of EXPLAIN o
a7f0: 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
a800: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45   void displayP4E
a810: 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c  xpr(StrAccum *p,
a820: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
a830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
a840: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
a850: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a860: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
a870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a880: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
a890: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
a8a0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
a8b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
a8c0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
a8d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a8e0: 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72  f(p, "%d", pExpr
a8f0: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
a900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a910: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
a920: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a930: 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22 29  pendf(p, "NULL")
a940: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a950: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
a960: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
a970: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
a980: 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78  (p, "r[%d]", pEx
a990: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
a9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a9b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
a9c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
a9d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
a9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a9f0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
aa00: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aa30: 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22 2c 20  pendf(p, "c%d", 
aa40: 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c  (int)pExpr->iCol
aa50: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
aa60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aa70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
aa80: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22        zOp = "LT"
aa90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
aaa0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
aab0: 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20     zOp = "LE";  
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
aad0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
aae0: 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  zOp = "GT";     
aaf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ab00: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70   TK_GE:      zOp
ab10: 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72   = "GE";      br
ab20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ab30: 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _NE:      zOp = 
ab40: 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "NE";      break
ab50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
ab60: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51  :      zOp = "EQ
ab70: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
ab80: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
ab90: 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20      zOp = "IS"; 
aba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abb0: 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
abc0: 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20   zOp = "ISNOT"; 
abd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
abe0: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f  e TK_AND:     zO
abf0: 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62  p = "AND";     b
ac00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ac10: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_OR:      zOp =
ac20: 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61   "OR";      brea
ac30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
ac40: 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41  LUS:    zOp = "A
ac50: 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  DD";     break;.
ac60: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
ac70: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22  :    zOp = "MUL"
ac80: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
ac90: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
aca0: 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20    zOp = "SUB";  
acb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
acc0: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
acd0: 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20  Op = "REM";     
ace0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
acf0: 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20  TK_BITAND:  zOp 
ad00: 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65  = "BITAND";  bre
ad10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ad20: 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22  BITOR:   zOp = "
ad30: 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b  BITOR";   break;
ad40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
ad50: 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56  SH:   zOp = "DIV
ad60: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
ad70: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
ad80: 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54  :  zOp = "LSHIFT
ad90: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
ada0: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
adb0: 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  zOp = "RSHIFT"; 
adc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
add0: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70   TK_CONCAT:  zOp
ade0: 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72   = "CONCAT";  br
adf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ae00: 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20  _UMINUS:  zOp = 
ae10: 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b  "MINUS";   break
ae20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  ;.    case TK_UP
ae30: 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c  LUS:   zOp = "PL
ae40: 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  US";    break;. 
ae50: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
ae60: 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f  T:  zOp = "BITNO
ae70: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
ae80: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
ae90: 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20   zOp = "NOT";   
aea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aeb0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f  e TK_ISNULL:  zO
aec0: 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62  p = "ISNULL";  b
aed0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aee0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d  K_NOTNULL: zOp =
aef0: 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61   "NOTNULL"; brea
af00: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
af10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
af20: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
af30: 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20  s", "expr");.   
af40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
af50: 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20   if( zOp ){.    
af60: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
af70: 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f  ndf(p, "%s(", zO
af80: 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50  p);.    displayP
af90: 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e  4Expr(p, pExpr->
afa0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
afb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
afc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
afd0: 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c 22  tr_append(p, ","
afe0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70  , 1);.      disp
aff0: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
b000: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
b010: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
b020: 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 29 22  tr_append(p, ")"
b030: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
b040: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
b050: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
b060: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
b070: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
b080: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
b090: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
b0a0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
b0b0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
b0c0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
b0d0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
b0e0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
b0f0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
b100: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
b110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
b120: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
b130: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
b140: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
b150: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
b160: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
b170: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
b180: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
b190: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
b1a0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
b1b0: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
b1c0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
b1d0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
b1e0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
b1f0: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
b200: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
b210: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
b220: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
b230: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61  eyInfo->aSortFla
b240: 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  gs!=0 );.      s
b250: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b260: 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70  df(&x, "k(%d", p
b270: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
b280: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
b290: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
b2a0: 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  nKeyField; j++){
b2b0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
b2c0: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
b2d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
b2e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b2f0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
b300: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
b310: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28   "";.        if(
b320: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22   strcmp(zColl, "
b330: 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43  BINARY")==0 ) zC
b340: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
b350: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b360: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 73 25  ppendf(&x, ",%s%
b370: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
b380: 20 20 20 20 20 20 28 70 4b 65 79 49 6e 66 6f 2d        (pKeyInfo-
b390: 3e 61 53 6f 72 74 46 6c 61 67 73 5b 6a 5d 20 26  >aSortFlags[j] &
b3a0: 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44   KEYINFO_ORDER_D
b3b0: 45 53 43 29 20 3f 20 22 2d 22 20 3a 20 22 22 2c  ESC) ? "-" : "",
b3c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b3d0: 20 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72   (pKeyInfo->aSor
b3e0: 74 46 6c 61 67 73 5b 6a 5d 20 26 20 4b 45 59 49  tFlags[j] & KEYI
b3f0: 4e 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c  NFO_ORDER_BIGNUL
b400: 4c 29 3f 20 22 4e 2e 22 20 3a 20 22 22 2c 20 0a  L)? "N." : "", .
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b420: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Coll);.      }. 
b430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b440: 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c  _append(&x, ")",
b450: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
b460: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
b470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
b480: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
b490: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
b4a0: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
b4b0: 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  r(&x, pOp->p4.pE
b4c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
b4d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b4e0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
b4f0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
b500: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
b510: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
b520: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b530: 70 70 65 6e 64 66 28 26 78 2c 20 22 28 25 2e 32  ppendf(&x, "(%.2
b540: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
b550: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
b560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b570: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
b580: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
b590: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
b5a0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
b5b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b5c0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
b5d0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
b5e0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
b5f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  k;.    }.#if def
b600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
b610: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
b620: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 20 20  BE_PROFILE).    
b630: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
b640: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
b650: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
b660: 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20  .pCtx->pFunc;.  
b670: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b680: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 28  appendf(&x, "%s(
b690: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
b6a0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
b6b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
b6d0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
b6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b6f0: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 6c  _appendf(&x, "%l
b700: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
b710: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
b720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b730: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
b740: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b750: 70 70 65 6e 64 66 28 26 78 2c 20 22 25 64 22 2c  ppendf(&x, "%d",
b760: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
b770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b780: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
b790: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b7a0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b7b0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
b7c0: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
b7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b7e0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
b7f0: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
b800: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
b810: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
b820: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
b830: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
b840: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
b850: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
b860: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
b870: 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20  nt|MEM_IntReal) 
b880: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b890: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b8a0: 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  x, "%lld", pMem-
b8b0: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
b8c0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
b8d0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
b8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b8f0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b900: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
b910: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
b920: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
b930: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
b940: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e          zP4 = "N
b950: 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ULL";.      }els
b960: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
b970: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  t( pMem->flags &
b980: 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
b990: 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f       zP4 = "(blo
b9a0: 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b)";.      }.   
b9b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b9c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b9d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b9e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
b9f0: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
ba00: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
ba10: 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
ba20: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
ba30: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ba40: 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20  (&x, "vtab:%p", 
ba50: 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72  pVtab);.      br
ba60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
ba70: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
ba80: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
ba90: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
baa0: 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61   *ai = pOp->p4.a
bab0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  i;.      int n =
bac0: 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65   ai[0];   /* The
bad0: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
bae0: 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73  f an INTARRAY is
baf0: 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20   always the.    
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74     ** count of t
bb20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
bb30: 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  ments to follow 
bb40: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  */.      for(i=1
bb50: 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=n; i++){.  
bb60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
bb70: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c  r_appendf(&x, ",
bb80: 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20  %d", ai[i]);.   
bb90: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
bba0: 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20  [0] = '[';.     
bbb0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
bbc0: 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b  end(&x, "]", 1);
bbd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbe0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
bbf0: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
bc00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
bc10: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 70 72 6f  appendf(&x, "pro
bc20: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
bc30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bc40: 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a  ase P4_DYNBLOB:.
bc50: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
bc60: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
bc70: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
bc80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bc90: 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a    case P4_TABLE:
bca0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
bcb0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
bcc0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70   "%s", pOp->p4.p
bcd0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
bce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bcf0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
bd00: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
bd10: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
bd20: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
bd30: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
bd40: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
bd50: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bd60: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
bd70: 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
bd80: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50  x);.  assert( zP
bd90: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
bda0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   zP4;.}.#endif /
bdb0: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
bdc0: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  4 */../*.** Decl
bdd0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
bde0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
bdf0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
be00: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
be10: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
be20: 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20  statements need 
be30: 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e  to know in advan
be40: 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ce the complete 
be50: 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68  set of.** attach
be60: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ed databases tha
be70: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20  t will be use.  
be80: 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20  A mask of these 
be90: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20  databases.** is 
bea0: 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d  maintained in p-
beb0: 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65  >btreeMask.  The
bec0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c   p->lockMask val
bed0: 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74  ue is the subset
bee0: 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d   of.** p->btreeM
bef0: 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73  ask of databases
bf00: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
bf10: 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  re a lock..*/.vo
bf20: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
bf30: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
bf40: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
bf50: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
bf60: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e  db->nDb && i<(in
bf70: 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b  t)sizeof(yDbMask
bf80: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
bf90: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
bfa0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
bfb0: 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d  ;.  DbMaskSet(p-
bfc0: 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a  >btreeMask, i);.
bfd0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
bfe0: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
bff0: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
c000: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d  .pBt) ){.    DbM
c010: 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61  askSet(p->lockMa
c020: 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  sk, i);.  }.}..#
c030: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c040: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
c050: 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ACHE)./*.** If S
c060: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
c070: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
c080: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
c090: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
c0a0: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
c0b0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
c0c0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
c0d0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
c0e0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
c0f0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
c100: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
c110: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
c120: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
c130: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
c140: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
c150: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
c160: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
c170: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
c180: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
c190: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
c1a0: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
c1b0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
c1c0: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
c1d0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
c1e0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
c1f0: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
c200: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
c210: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
c220: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
c230: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
c240: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
c250: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
c260: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
c270: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
c280: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
c290: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
c2a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c2b0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
c2c0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
c2d0: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
c2e0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
c2f0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
c300: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
c310: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
c320: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
c330: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
c340: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
c350: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
c360: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
c370: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
c380: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
c390: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
c3a0: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
c3b0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
c3c0: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
c3d0: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
c3e0: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
c3f0: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
c400: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
c410: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
c420: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
c430: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
c440: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
c450: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
c460: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
c470: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
c480: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
c490: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
c4a0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
c4b0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
c4c0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
c4d0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
c4e0: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
c4f0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
c500: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
c510: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
c520: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
c530: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
c540: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
c550: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
c560: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
c570: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
c580: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
c590: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
c5a0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
c5b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c5c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
c5d0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
c5e0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
c5f0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
c600: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
c610: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
c620: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
c630: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
c640: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
c650: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76  _NOINLINE void v
c660: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
c670: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
c680: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
c690: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
c6a0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
c6b0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
c6c0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
c6d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
c6e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
c6f0: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
c700: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
c710: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
c720: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
c730: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c740: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
c750: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
c760: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c770: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
c780: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
c790: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
c7a0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
c7b0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
c7c0: 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29  /.  vdbeLeave(p)
c7d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
c7e0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
c7f0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
c800: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
c810: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
c820: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
c830: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
c840: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
c850: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
c860: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
c870: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
c880: 20 70 63 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70   pc, VdbeOp *pOp
c890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
c8a0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
c8b0: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
c8c0: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
c8d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
c8e0: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
c8f0: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
c900: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
c910: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
c920: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
c930: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
c940: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
c950: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
c960: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
c970: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
c980: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
c990: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
c9a0: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
c9b0: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
c9c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  ;.#endif.  /* NB
c9d0: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
c9e0: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
c9f0: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
ca00: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
ca10: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
ca20: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
ca30: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
ca40: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
ca50: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
ca60: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
ca70: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
ca80: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
ca90: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
caa0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
cab0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
cac0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
cad0: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
cae0: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
caf0: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
cb00: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
cb10: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
cb20: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
cb30: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
cb40: 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a  Mem element..*/.
cb50: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
cb60: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
cb70: 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20   int N, sqlite3 
cb80: 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b  *db, u16 flags){
cb90: 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e  .  while( (N--)>
cba0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  0 ){.    p->db =
cbb0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67   db;.    p->flag
cbc0: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70  s = flags;.    p
cbd0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
cbe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cbf0: 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70  BUG.    p->pScop
cc00: 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  yFrom = 0;.#endi
cc10: 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d  f.    p++;.  }.}
cc20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
cc30: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
cc40: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
cc50: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
cc60: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
cc70: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
cc80: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
cc90: 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b  m *pEnd = &p[N];
cca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
ccb0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66   = p->db;.    if
ccc0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
ccd0: 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ed ){.      do{.
cce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
ccf0: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
cd00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
cd10: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
cd20: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
cd30: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
cd40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  n;.    }.    do{
cd50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
cd60: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
cd70: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
cd80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cd90: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
cda0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
cdb0: 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p) );..      /* 
cdc0: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
cdd0: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
cde0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
cdf0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ce00: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
ce10: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
ce20: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
ce30: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
ce40: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
ce50: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
ce60: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
ce70: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
ce80: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
ce90: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
cea0: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
ceb0: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
cec0: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
ced0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
cee0: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
cef0: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
cf00: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
cf10: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
cf20: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
cf30: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
cf40: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
cf50: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
cf60: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
cf70: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
cf80: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
cf90: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
cfa0: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
cfb0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
cfc0: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
cfd0: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
cfe0: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
cff0: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
d000: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
d010: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
d020: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
d030: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
d040: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
d050: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
d060: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
d070: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
d080: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
d090: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d0a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67  ->flags & MEM_Ag
d0b0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
d0c0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
d0d0: 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20  MEM_Dyn );.     
d0e0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 78 44   testcase( p->xD
d0f0: 65 6c 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 46  el==sqlite3VdbeF
d100: 72 61 6d 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20  rameMemDel );.  
d110: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
d120: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
d130: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n) ){.        sq
d140: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
d150: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  ase(p);.      }e
d160: 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c  lse if( p->szMal
d170: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
d180: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
d190: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
d1a0: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
d1b0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
d1c0: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
d1d0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
d1e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
d1f0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  +p)<pEnd );.  }.
d200: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d210: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72  _DEBUG./*.** Ver
d220: 69 66 79 20 74 68 61 74 20 70 46 72 61 6d 65 20  ify that pFrame 
d230: 69 73 20 61 20 76 61 6c 69 64 20 56 64 62 65 46  is a valid VdbeF
d240: 72 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 52  rame pointer.  R
d250: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
d260: 20 69 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65   is.** and false
d270: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73   if something is
d280: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
d290: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
d2a0: 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69  tended for use i
d2b0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
d2c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c  ) statements onl
d2d0: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
d2e0: 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69  3VdbeFrameIsVali
d2f0: 64 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  d(VdbeFrame *pFr
d300: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 46 72 61  ame){.  if( pFra
d310: 6d 65 2d 3e 69 46 72 61 6d 65 4d 61 67 69 63 21  me->iFrameMagic!
d320: 3d 53 51 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41  =SQLITE_FRAME_MA
d330: 47 49 43 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  GIC ) return 0;.
d340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
d350: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
d360: 73 20 69 73 20 61 20 64 65 73 74 72 75 63 74 6f  s is a destructo
d370: 72 20 6f 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63  r on a Mem objec
d380: 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c  t (which is real
d390: 6c 79 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  ly an sqlite3_va
d3a0: 6c 75 65 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c  lue).** that del
d3b0: 65 74 65 73 20 74 68 65 20 46 72 61 6d 65 20 6f  etes the Frame o
d3c0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
d3d0: 74 61 63 68 65 64 20 74 6f 20 69 74 20 61 73 20  tached to it as 
d3e0: 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  a blob..**.** Th
d3f0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
d400: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 46  not delete the F
d410: 72 61 6d 65 20 72 69 67 68 74 20 61 77 61 79 2e  rame right away.
d420: 20 20 49 74 20 6d 65 72 65 6c 79 20 61 64 64 73    It merely adds
d430: 20 74 68 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f   the.** frame to
d440: 20 61 20 6c 69 73 74 20 6f 66 20 66 72 61 6d 65   a list of frame
d450: 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  s to be deleted 
d460: 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 68 61  when the Vdbe ha
d470: 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lts..*/.void sql
d480: 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d  ite3VdbeFrameMem
d490: 44 65 6c 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  Del(void *pArg){
d4a0: 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
d4b0: 72 61 6d 65 20 3d 20 28 56 64 62 65 46 72 61 6d  rame = (VdbeFram
d4c0: 65 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  e*)pArg;.  asser
d4d0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  t( sqlite3VdbeFr
d4e0: 61 6d 65 49 73 56 61 6c 69 64 28 70 46 72 61 6d  ameIsValid(pFram
d4f0: 65 29 20 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  e) );.  pFrame->
d500: 70 50 61 72 65 6e 74 20 3d 20 70 46 72 61 6d 65  pParent = pFrame
d510: 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  ->v->pDelFrame;.
d520: 20 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65    pFrame->v->pDe
d530: 6c 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b  lFrame = pFrame;
d540: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
d550: 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62  e a VdbeFrame ob
d560: 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e  ject and its con
d570: 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65  tents. VdbeFrame
d580: 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20   objects are.** 
d590: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65  allocated by the
d5a0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
d5b0: 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62  de in sqlite3Vdb
d5c0: 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64  eExec()..*/.void
d5d0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d5e0: 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d  eDelete(VdbeFram
d5f0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
d600: 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64    Mem *aMem = Vd
d610: 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20  beFrameMem(p);. 
d620: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70   VdbeCursor **ap
d630: 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f  Csr = (VdbeCurso
d640: 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43  r **)&aMem[p->nC
d650: 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65  hildMem];.  asse
d660: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 46  rt( sqlite3VdbeF
d670: 72 61 6d 65 49 73 56 61 6c 69 64 28 70 29 20 29  rameIsValid(p) )
d680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d690: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
d6a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d6b0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
d6c0: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
d6d0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
d6e0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
d6f0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
d700: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
d710: 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70  ata(p->v->db, &p
d720: 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
d730: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
d740: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
d750: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
d760: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
d770: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
d780: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
d790: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
d7a0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
d7b0: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
d7c0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
d7d0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d7e0: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
d7f0: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
d800: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
d810: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
d820: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
d830: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
d840: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
d850: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
d860: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
d870: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
d880: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
d890: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
d8a0: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
d8b0: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
d8c0: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
d8d0: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
d8e0: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
d8f0: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
d900: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
d910: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
d920: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
d930: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
d940: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31  ERY PLAN..** 201
d950: 38 2d 30 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e  8-04-24:  In p->
d960: 65 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c  explain==2 mode,
d970: 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63   the OP_Init opc
d980: 6f 64 65 73 20 6f 66 20 74 72 69 67 67 65 72 73  odes of triggers
d990: 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 73 68 6f  .** are also sho
d9a0: 77 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  wn, so that the 
d9b0: 62 6f 75 6e 64 61 72 69 65 73 20 62 65 74 77 65  boundaries betwe
d9c0: 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  en the main prog
d9d0: 72 61 6d 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20  ram and.** each 
d9e0: 74 72 69 67 67 65 72 20 61 72 65 20 63 6c 65 61  trigger are clea
d9f0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  r..**.** When p-
da00: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
da10: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
da20: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
da30: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
da40: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
da50: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
da60: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
da70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
da80: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
dab0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
dae0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
daf0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
db00: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
db10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
db20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
db30: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
db40: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
db50: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
db60: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
db70: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
db80: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
db90: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
dbc0: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
dbd0: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
dbe0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
dbf0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
dc00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
dc10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
dc20: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dc50: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
dc60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dc70: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dc80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
dc90: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
dca0: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
dcb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dcc0: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
dcd0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
dce0: 74 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20  t bListSubprogs 
dcf0: 3d 20 28 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  = (p->explain==1
dd00: 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   || (db->flags &
dd10: 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45   SQLITE_TriggerE
dd20: 51 50 29 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70  QP)!=0);.  Op *p
dd30: 4f 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Op = 0;..  asser
dd40: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
dd50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
dd60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
dd70: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
dd80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
dd90: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
dda0: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
ddb0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
ddc0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
ddd0: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
dde0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
ddf0: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
de00: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
de10: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
de20: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
de30: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
de40: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
de50: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
de60: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
de70: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
de80: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
de90: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
dea0: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
deb0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
dec0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
ded0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
dee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
def0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
df00: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
df10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
df20: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
df30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
df40: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
df50: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  led.  */.    sql
df60: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
df70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
df80: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
df90: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
dfa0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
dfb0: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
dfc0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
dfd0: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
dfe0: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
dff0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
e000: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
e010: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
e020: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
e030: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e040: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
e050: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
e060: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
e070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
e080: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
e090: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
e0a0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
e0b0: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
e0c0: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
e0d0: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
e0e0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
e0f0: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
e100: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
e110: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
e120: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
e130: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
e140: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 62 4c 69 73  >nOp;.  if( bLis
e150: 74 53 75 62 70 72 6f 67 73 20 29 7b 0a 20 20 20  tSubprogs ){.   
e160: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
e170: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
e180: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
e190: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
e1a0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
e1b0: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
e1c0: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
e1d0: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
e1e0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
e1f0: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
e200: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
e210: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
e220: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
e230: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
e240: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
e250: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
e260: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
e270: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
e280: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
e290: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
e2a0: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
e2b0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
e2c0: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
e2d0: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
e2e0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
e2f0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
e300: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
e310: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
e320: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
e330: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
e340: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
e350: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
e360: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
e370: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
e380: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
e390: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
e3a0: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
e3b0: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
e3c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c     }.  }..  whil
e3d0: 65 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65  e(1){  /* Loop e
e3e0: 78 69 74 73 20 76 69 61 20 62 72 65 61 6b 20 2a  xits via break *
e3f0: 2f 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  /.    i = p->pc+
e400: 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 52  +;.    if( i>=nR
e410: 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ow ){.      p->r
e420: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e430: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e440: 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62 72 65  _DONE;.      bre
e450: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
e460: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
e470: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
e480: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
e490: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
e4a0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
e4b0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
e4c0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
e4d0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
e4e0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
e4f0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
e500: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
e510: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
e520: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
e530: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
e540: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
e550: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
e560: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
e570: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
e580: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 61   p->nOp;.      a
e590: 73 73 65 72 74 28 20 61 70 53 75 62 21 3d 30 20  ssert( apSub!=0 
e5a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e5b0: 20 6e 53 75 62 3e 30 20 29 3b 0a 20 20 20 20 20   nSub>0 );.     
e5c0: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
e5d0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
e5e0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
e5f0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
e600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
e610: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 20 7c 7c  apSub[j]->nOp ||
e620: 20 6a 2b 31 3c 6e 53 75 62 20 29 3b 0a 20 20 20   j+1<nSub );.   
e630: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
e640: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
e650: 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  i];.    }..    /
e660: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
e670: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
e680: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
e690: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
e6a0: 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  as.    ** a P4_S
e6b0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
e6c0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
e6d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
e6e0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
e6f0: 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20  .    ** kept in 
e700: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
e710: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
e720: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
e730: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
e740: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
e750: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
e760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e770: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 26   bListSubprogs &
e780: 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  & pOp->p4type==P
e790: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
e7a0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
e7b0: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
e7c0: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
e7d0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
e7e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
e7f0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
e800: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
e810: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
e820: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e830: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
e840: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
e850: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  ->rc = sqlite3Vd
e860: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
e870: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b  nByte, nSub!=0);
e880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
e890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8a0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e8b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e8c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e8d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e8e0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
e8f0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
e900: 0a 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e  .        apSub[n
e910: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
e920: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
e930: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
e940: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
e950: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
e960: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
e970: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
e980: 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e  nRow += pOp->p4.
e990: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20  pProgram->nOp;. 
e9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e9b0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c   if( p->explain<
e9c0: 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  2 ) break;.    i
e9d0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
e9e0: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20 62 72 65  OP_Explain ) bre
e9f0: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ak;.    if( pOp-
ea00: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
ea10: 20 26 26 20 70 2d 3e 70 63 3e 31 20 29 20 62 72   && p->pc>1 ) br
ea20: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
ea30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ea40: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  .    if( db->u1.
ea50: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
ea60: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
ea70: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
ea80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ea90: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
eaa0: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
eab0: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
eac0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d  r(p->rc));.    }
ead0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
eae0: 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20 69 66 28   *zP4;.      if(
eaf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
eb00: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
eb10: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
eb20: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
eb30: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
eb60: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
eb70: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
eb80: 20 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e   .        pMem->
eb90: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
eba0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
ebb0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
ebc0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
ebd0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
ebe0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
ebf0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
ec00: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ec10: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >z!=0 );.       
ec20: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
ec30: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
ec40: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
ec50: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ec60: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
ec70: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  em++;.      }.. 
ec80: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ec90: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
eca0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
ecb0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 70  /* P1 */.      p
ece0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d  Mem++;..      pM
ecf0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ed00: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
ed10: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
ed40: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
ed50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ed60: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
ed70: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ed80: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
edb0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
edc0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
edd0: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
ede0: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
edf0: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P4 */.        
ee00: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
ee10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ee20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ee30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ee40: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
ee50: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
ee60: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
ee70: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
ee80: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
ee90: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
eea0: 20 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d       if( zP4!=pM
eeb0: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20  em->z ){.       
eec0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20   pMem->n = 0;.  
eed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eee0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
eef0: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
ef00: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20  _UTF8, 0);.     
ef10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ef20: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
ef30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
ef40: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
ef50: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
ef60: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ef70: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
ef80: 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  8;.      }.     
ef90: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
efa0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
efb0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  1 ){.        if(
efc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
efd0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
efe0: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
eff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
f000: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
f020: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
f030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f040: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f050: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
f060: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
f070: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ->n = 2;.       
f080: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f090: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
f0a0: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
f0b0: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
f0c0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
f0d0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
f0e0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
f0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f100: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
f110: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 20 20 69  MMENTS.        i
f120: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
f130: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
f140: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
f150: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f160: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
f170: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
f180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f190: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
f1a0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
f1b0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
f1c0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
f1d0: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
f1e0: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
f1f0: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
f200: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
f210: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
f220: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  8;.#else.       
f230: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f240: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f260: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
f270: 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  dif.      }..   
f280: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
f290: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
f2a0: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70  lain-1);.      p
f2b0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
f2c0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
f2d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
f2e0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
f2f0: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
f300: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
f310: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
f320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
f330: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
f340: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
f350: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
f360: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
f370: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
f380: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
f390: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
f3a0: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
f3b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
f3c0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
f3d0: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
f3e0: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
f3f0: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
f400: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
f410: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
f420: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
f430: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
f440: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
f450: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
f460: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
f470: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
f480: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
f490: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
f4a0: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
f4b0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
f4c0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
f4d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f4e0: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
f4f0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
f500: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
f510: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
f520: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
f530: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
f540: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f550: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
f560: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
f570: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
f580: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
f590: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
f5a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f5b0: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
f5c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
f5d0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
f5e0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
f5f0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
f600: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
f610: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
f620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
f630: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
f640: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
f650: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
f660: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
f670: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
f680: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
f690: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
f6a0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
f6b0: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
f6c0: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
f6d0: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
f6e0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
f6f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
f710: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
f720: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
f730: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
f740: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
f750: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
f760: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
f770: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
f780: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
f790: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41  IOTRACE */../* A
f7a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
f7b0: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
f7c0: 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  bes bulk memory 
f7d0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
f7e0: 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f  e.** by subcompo
f7f0: 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61  nents of a prepa
f800: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
f810: 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  Space is allocat
f820: 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52  ed out.** of a R
f830: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
f840: 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63  ect by the alloc
f850: 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
f860: 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74  below..*/.struct
f870: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b   ReusableSpace {
f880: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20  .  u8 *pSpace;  
f890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61            /* Ava
f8a0: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
f8b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
f8c0: 20 6e 46 72 65 65 3b 20 20 20 2f 2a 20 42 79 74   nFree;   /* Byt
f8d0: 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
f8e0: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73 71 6c 69  memory */.  sqli
f8f0: 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 65 64 65  te3_int64 nNeede
f900: 64 3b 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65  d; /* Total byte
f910: 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74  s that could not
f920: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   be allocated */
f930: 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61  .};../* Try to a
f940: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
f950: 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  tes of 8-byte al
f960: 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72  igned bulk memor
f970: 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72  y for pBuf.** fr
f980: 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  om the ReusableS
f990: 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65  pace object.  Re
f9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
f9b0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  o the allocated.
f9c0: 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63  ** memory on suc
f9d0: 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66  cess.  If insuff
f9e0: 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73  icient memory is
f9f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
fa00: 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61  e.** ReusableSpa
fa10: 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65  ce object, incre
fa20: 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65  ase the Reusable
fa30: 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a  Space.nNeeded.**
fa40: 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d   value by the am
fa50: 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20  ount needed and 
fa60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
fa70: 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  ** If pBuf is no
fa80: 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  t initially NULL
fa90: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
faa0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73  t the memory has
fab0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
fac0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
fad0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
fae0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a  is routine, so j
faf0: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70  ust return a cop
fb00: 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64  y.** of pBuf and
fb10: 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53   leave ReusableS
fb20: 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  pace unchanged..
fb30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63  **.** This alloc
fb40: 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64  ator is employed
fb50: 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e   to repurpose un
fb60: 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68  used slots at th
fb70: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
fb80: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20  opcode array of 
fb90: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66  prepared state f
fba0: 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20  or other memory 
fbb0: 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65  needs of the pre
fbc0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
fbd0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
fbe0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
fbf0: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
fc00: 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42  eSpace *p,  /* B
fc10: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
fc20: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
fc30: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
fc40: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
fc50: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
fc60: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
fc70: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
fc80: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20 20  _int64 nByte    
fc90: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
fca0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
fcb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
fcc0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
fcd0: 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a  T(p->pSpace) );.
fce0: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
fcf0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
fd00: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
fd10: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e  if( nByte <= p->
fd20: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  nFree ){.      p
fd30: 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65  ->nFree -= nByte
fd40: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
fd50: 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72  p->pSpace[p->nFr
fd60: 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ee];.    }else{.
fd70: 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64        p->nNeeded
fd80: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
fd90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
fda0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
fdb0: 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72  ENT(pBuf) );.  r
fdc0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
fdd0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
fde0: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
fdf0: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
fe00: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
fe10: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
fe20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
fe30: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
fe40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
fe50: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
fe60: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
fe70: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
fe80: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
fe90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fea0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
feb0: 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e  AGIC_INIT || p->
fec0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
fed0: 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a  C_RESET );..  /*
fee0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
fef0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
ff00: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
ff10: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
ff20: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
ff30: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
ff40: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
ff50: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
ff60: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
ff70: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
ff80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ff90: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
ffa0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
ffb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
ffc0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
ffd0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
ffe0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
fff0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
10000 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
10010 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
10020 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
10030 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
10040 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
10050 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
10060 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
10070 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
10080 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
10090 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
100a0 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
100b0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
100c0 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
100d0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
100e0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
100f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
10100 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
10110 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
10120 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
10130 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
10140 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
10150 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
10160 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
10170 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
10180 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
10190 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
101a0 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
101b0 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
101c0 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
101d0 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
101e0 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
101f0 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
10200 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
10210 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
10220 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
10230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
10240 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
10250 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
10260 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
10270 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
10280 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10290 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
102a0 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
102b0 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
102c0 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
102d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
102e0 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
102f0 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
10300 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
10310 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
10320 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
10330 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
10340 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
10350 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
10360 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
10370 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
10380 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
10390 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
103a0 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
103b0 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
103c0 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
103d0 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
103e0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
103f0 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
10400 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
10410 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
10420 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
10430 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
10440 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
10450 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
10460 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
10470 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
104a0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
104b0 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
104c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
104d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
104e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10500 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
10510 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
10520 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10540 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
10550 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
10560 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
10570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10580 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
10590 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
105a0 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
105d0 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
105e0 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
10610 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
10620 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
10630 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
10640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10650 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10660 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
10670 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
10680 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
10690 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
106a0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
106b0 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
106c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106d0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
106e0 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
106f0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
10700 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10710 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
10720 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
10730 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
10740 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
10750 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
10760 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
10770 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
10780 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
10790 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
107a0 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
107b0 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75  .  .  /* Each cu
107c0 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f  rsor uses a memo
107d0 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69  ry cell.  The fi
107e0 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73  rst cursor (curs
107f0 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75  or 0) can.  ** u
10800 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68  se aMem[0] which
10810 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
10820 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  e used by the VD
10830 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  BE program.  All
10840 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
10850 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
10860 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72  Mem[] for cursor
10870 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e  s 1 and greater.
10880 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
10890 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
108a0 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
108b0 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20   nCursor;.  if( 
108c0 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d  nCursor==0 && nM
108d0 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20  em>0 ) nMem++;  
108e0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65  /* Space for aMe
108f0 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74  m[0] even if not
10900 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46   used */..  /* F
10910 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
10920 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f  ch reusable memo
10930 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
10940 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10950 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72  e.  ** opcode ar
10960 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61  ray.  This extra
10970 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10980 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  reallocated for 
10990 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20  other elements. 
109a0 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61   ** of the prepa
109b0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
109c0 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38   */.  n = ROUND8
109d0 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e  (sizeof(Op)*p->n
109e0 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op);            
109f0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70    /* Bytes of op
10a00 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64  code memory used
10a10 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d   */.  x.pSpace =
10a20 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b   &((u8*)p->aOp)[
10a30 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n];             
10a40 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f    /* Unused opco
10a50 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  de memory */.  a
10a60 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
10a70 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53  E_ALIGNMENT(x.pS
10a80 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72  pace) );.  x.nFr
10a90 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  ee = ROUNDDOWN8(
10aa0 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
10ab0 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65  c - n);  /* Byte
10ac0 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f  s of unused memo
10ad0 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
10ae0 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  x.nFree>=0 );.  
10af0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10b00 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e  TE_ALIGNMENT(&x.
10b10 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29  pSpace[x.nFree])
10b20 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
10b30 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
10b40 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
10b50 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
10b60 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
10b70 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
10b80 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
10b90 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
10ba0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
10bb0 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
10bc0 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 3d 20 7b 0a  azColName[] = {.
10bd0 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22         "addr", "
10be0 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22  opcode", "p1", "
10bf0 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c  p2", "p3", "p4",
10c00 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22   "p5", "comment"
10c10 2c 0a 20 20 20 20 20 20 20 22 69 64 22 2c 20 22  ,.       "id", "
10c20 70 61 72 65 6e 74 22 2c 20 22 6e 6f 74 75 73 65  parent", "notuse
10c30 64 22 2c 20 22 64 65 74 61 69 6c 22 0a 20 20 20  d", "detail".   
10c40 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 46 69 72   };.    int iFir
10c50 73 74 2c 20 6d 78 2c 20 69 3b 0a 20 20 20 20 69  st, mx, i;.    i
10c60 66 28 20 6e 4d 65 6d 3c 31 30 20 29 20 6e 4d 65  f( nMem<10 ) nMe
10c70 6d 20 3d 20 31 30 3b 0a 20 20 20 20 69 66 28 20  m = 10;.    if( 
10c80 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
10c90 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
10ca0 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
10cb0 73 28 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  s(p, 4);.      i
10cc0 46 69 72 73 74 20 3d 20 38 3b 0a 20 20 20 20 20  First = 8;.     
10cd0 20 6d 78 20 3d 20 31 32 3b 0a 20 20 20 20 7d 65   mx = 12;.    }e
10ce0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10cf0 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10d00 28 70 2c 20 38 29 3b 0a 20 20 20 20 20 20 69 46  (p, 8);.      iF
10d10 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
10d20 6d 78 20 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20  mx = 8;.    }.  
10d30 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
10d40 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
10d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10d60 43 6f 6c 4e 61 6d 65 28 70 2c 20 69 2d 69 46 69  ColName(p, i-iFi
10d70 72 73 74 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  rst, COLNAME_NAM
10d80 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
10da0 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 53 51 4c  zColName[i], SQL
10db0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
10dc0 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69   }.  }.  p->expi
10dd0 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
10de0 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
10df0 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
10e00 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
10e10 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e   allocated in on
10e20 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61  e or two.  ** pa
10e30 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
10e40 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
10e50 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
10e60 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a   memory at the .
10e70 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
10e80 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
10e90 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
10ea0 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
10eb0 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
10ec0 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
10ed0 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
10ee0 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
10ef0 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
10f00 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
10f10 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75   the remainder u
10f20 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d  sing a fresh mem
10f30 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  ory allocation. 
10f40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
10f50 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
10f60 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
10f70 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
10f80 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
10f90 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
10fa0 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65   memory at the e
10fb0 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
10fc0 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61   array.  This ca
10fd0 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
10fe0 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
10ff0 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
11000 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
11010 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
11020 20 2a 2f 0a 20 20 78 2e 6e 4e 65 65 64 65 64 20   */.  x.nNeeded 
11030 3d 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  = 0;.  p->aMem =
11040 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
11050 30 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  0, nMem*sizeof(M
11060 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 56 61 72 20  em));.  p->aVar 
11070 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
11080 20 30 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28   0, nVar*sizeof(
11090 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 70 41 72  Mem));.  p->apAr
110a0 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
110b0 78 2c 20 30 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  x, 0, nArg*sizeo
110c0 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61  f(Mem*));.  p->a
110d0 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
110e0 65 28 26 78 2c 20 30 2c 20 6e 43 75 72 73 6f 72  e(&x, 0, nCursor
110f0 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
11100 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51  or*));.#ifdef SQ
11110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
11120 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70 2d  _SCANSTATUS.  p-
11130 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
11140 70 61 63 65 28 26 78 2c 20 30 2c 20 70 2d 3e 6e  pace(&x, 0, p->n
11150 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
11160 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 78 2e  .#endif.  if( x.
11170 6e 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 78  nNeeded ){.    x
11180 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72  .pSpace = p->pFr
11190 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
111a0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e  llocRawNN(db, x.
111b0 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e  nNeeded);.    x.
111c0 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65  nFree = x.nNeede
111d0 64 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  d;.    if( !db->
111e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
111f0 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20        p->aMem = 
11200 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
11210 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
11220 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20  eof(Mem));.     
11230 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
11240 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61  Space(&x, p->aVa
11250 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
11260 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  em));.      p->a
11270 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
11280 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20  e(&x, p->apArg, 
11290 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
112a0 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  ));.      p->apC
112b0 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
112c0 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43  &x, p->apCsr, nC
112d0 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
112e0 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
112f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11300 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
11310 0a 20 20 20 20 20 20 70 2d 3e 61 6e 45 78 65 63  .      p->anExec
11320 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
11330 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  , p->anExec, p->
11340 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
11350 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11360 20 7d 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20   }..  p->pVList 
11370 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  = pParse->pVList
11380 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  ;.  pParse->pVLi
11390 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78  st =  0;.  p->ex
113a0 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
113b0 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64  explain;.  if( d
113c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
113d0 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
113e0 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73   0;.    p->nCurs
113f0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  or = 0;.    p->n
11400 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Mem = 0;.  }else
11410 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  {.    p->nCursor
11420 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
11430 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
11440 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d  )nVar;.    initM
11450 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
11460 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e   nVar, db, MEM_N
11470 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65  ull);.    p->nMe
11480 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  m = nMem;.    in
11490 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  itMemArray(p->aM
114a0 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45  em, nMem, db, ME
114b0 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20  M_Undefined);.  
114c0 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73    memset(p->apCs
114d0 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  r, 0, nCursor*si
114e0 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
114f0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
11500 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
11510 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d  ANSTATUS.    mem
11520 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30  set(p->anExec, 0
11530 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
11540 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
11550 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11560 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
11570 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
11580 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
11590 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
115a0 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
115b0 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
115c0 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
115d0 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
115e0 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
115f0 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
11600 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
11610 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
11620 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
11630 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  tx==0 || pCx->eC
11640 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
11650 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
11660 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
11670 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
11680 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
11690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
116a0 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
116b0 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
116c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
116d0 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
116e0 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
116f0 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c  pCx->isEphemeral
11700 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11710 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69  pCx->pBtx ) sqli
11720 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
11730 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20  x->pBtx);.      
11740 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
11750 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
11760 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
11770 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
11780 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   by.        ** t
11790 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
117a0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
117b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
117c0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  Cx->uc.pCursor!=
117d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
117e0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
117f0 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75  rsor(pCx->uc.pCu
11800 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
11810 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11820 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11830 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11840 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  LE.    case CURT
11850 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20  YPE_VTAB: {.    
11860 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
11870 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70  ursor *pVCur = p
11880 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20  Cx->uc.pVCur;.  
11890 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
118a0 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
118b0 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62  e = pVCur->pVtab
118c0 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
118d0 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e   assert( pVCur->
118e0 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b  pVtab->nRef>0 );
118f0 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56  .      pVCur->pV
11900 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
11910 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
11920 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20  se(pVCur);.     
11930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
11940 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
11950 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
11960 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  ors in the curre
11970 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nt frame..*/.sta
11980 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75  tic void closeCu
11990 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62  rsorsInFrame(Vdb
119a0 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
119b0 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
119c0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
119d0 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
119e0 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
119f0 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
11a00 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
11a10 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
11a20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
11a30 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
11a40 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
11a50 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
11a60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11a70 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
11a80 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
11a90 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
11aa0 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
11ab0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
11ac0 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
11ad0 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
11ae0 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
11af0 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
11b00 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
11b10 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
11b20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11b30 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
11b40 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
11b50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
11b60 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73  Frame->v;.  clos
11b70 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
11b80 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v);.#ifdef SQLIT
11b90 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
11ba0 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
11bb0 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
11bc0 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
11bd0 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
11be0 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
11bf0 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
11c00 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
11c10 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
11c20 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
11c30 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
11c40 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
11c50 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
11c60 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
11c70 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
11c80 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
11c90 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
11ca0 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
11cb0 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
11cc0 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
11cd0 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71  >nDbChange;.  sq
11ce0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
11cf0 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76  uxData(v->db, &v
11d00 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
11d10 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74  0);.  v->pAuxDat
11d20 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  a = pFrame->pAux
11d30 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Data;.  pFrame->
11d40 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
11d50 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
11d60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
11d70 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
11d80 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
11d90 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
11da0 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
11db0 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
11dc0 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
11dd0 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
11de0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
11df0 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
11e00 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
11e10 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
11e20 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
11e30 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
11e40 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
11e50 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
11e60 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
11e70 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
11e80 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
11e90 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
11ea0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
11eb0 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
11ec0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
11ed0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
11ee0 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
11ef0 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
11f00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11f10 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
11f20 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Frame);.    p->p
11f30 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  Frame = 0;.    p
11f40 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->nFrame = 0;.  
11f50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
11f60 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c  Frame==0 );.  cl
11f70 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
11f80 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  e(p);.  if( p->a
11f90 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
11fa0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  seMemArray(p->aM
11fb0 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  em, p->nMem);.  
11fc0 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
11fd0 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
11fe0 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
11ff0 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
12000 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
12010 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
12020 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12030 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
12040 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
12050 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
12060 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
12070 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
12080 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
12090 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
120a0 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62  eteAuxData(p->db
120b0 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
120c0 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
120d0 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
120e0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   );.}../*.** Set
120f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12100 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
12110 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
12120 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
12130 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
12140 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
12150 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
12160 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
12170 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
12180 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
12190 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
121a0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
121b0 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
121c0 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
121d0 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
121e0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
121f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12200 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
12210 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
12220 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  umn){.  int n;. 
12230 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12240 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ->db;..  if( p->
12250 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  nResColumn ){.  
12260 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
12270 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
12280 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
12290 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c  NAME_N);.    sql
122a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
122b0 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d  ->aColName);.  }
122c0 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
122d0 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
122e0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
122f0 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
12300 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
12310 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
12320 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
12330 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
12340 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
12350 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
12360 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d   initMemArray(p-
12370 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62  >aColName, n, db
12380 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a  , MEM_Null);.}..
12390 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
123a0 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
123b0 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
123c0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
123d0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
123e0 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
123f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
12400 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
12410 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
12420 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
12430 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
12440 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
12450 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
12460 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
12470 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
12480 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
12490 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
124a0 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
124b0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
124c0 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
124d0 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
124e0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
124f0 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
12500 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
12510 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
12520 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
12530 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
12540 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
12550 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
12560 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12580 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
12590 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
125a0 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
125d0 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
125e0 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
12610 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
12620 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
12630 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12650 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
12660 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
12670 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
12680 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
12690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
126a0 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
126b0 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
126c0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
126d0 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
126e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
126f0 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
12700 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
12710 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
12720 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
12730 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
12740 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
12750 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
12760 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
12770 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
12780 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
12790 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
127a0 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
127b0 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
127c0 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
127d0 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
127e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
127f0 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
12800 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
12810 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
12820 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
12830 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
12840 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
12850 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
12860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12870 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
12880 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
12890 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
128a0 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
128b0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
128c0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
128d0 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
128e0 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
128f0 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
12900 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
12910 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
12920 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
12930 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
12940 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
12950 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12960 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
12970 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
12980 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
12990 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
129a0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
129b0 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
129c0 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
129d0 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
129e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
129f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12a00 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
12a10 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61  candidates for a
12a20 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
12a30 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20  t using a.      
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
12a50 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a  master-journal *
12a60 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
12a70 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
12a80 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
12a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12aa0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12ab0 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
12ac0 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
12ad0 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
12ae0 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
12af0 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
12b00 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
12b10 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
12b20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
12b30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
12b40 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
12b50 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
12b60 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
12b70 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
12b80 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
12b90 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
12ba0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
12bb0 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
12bc0 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
12bd0 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
12be0 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
12bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12c00 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
12c10 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
12c20 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
12c30 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
12c40 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
12c50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
12c60 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
12c70 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
12c80 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
12c90 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
12ca0 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
12cb0 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
12cc0 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
12cd0 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
12ce0 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
12cf0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
12d00 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
12d10 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
12d20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
12d30 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
12d40 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
12d50 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
12d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
12d70 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
12d80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
12d90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
12da0 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
12db0 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
12dc0 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
12dd0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12de0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
12df0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
12e00 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12e10 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12e20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
12e30 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
12e40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65   ){.      /* Whe
12e50 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61  ther or not a da
12e60 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65  tabase might nee
12e70 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
12e80 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a  al depends upon.
12e90 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75        ** its jou
12ea0 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67  rnal mode (among
12eb0 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20   other things). 
12ec0 20 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74   This matrix det
12ed0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20  ermines which.  
12ee0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d      ** journal m
12ef0 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65  odes use a maste
12f00 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68  r journal and wh
12f10 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20  ich do not */.  
12f20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
12f30 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20   u8 aMJNeeded[] 
12f40 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44  = {.        /* D
12f50 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20  ELETE   */  1,. 
12f60 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53         /* PERSIS
12f70 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  T   */ 1,.      
12f80 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a    /* OFF       *
12f90 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
12fa0 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a  TRUNCATE  */ 1,.
12fb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52          /* MEMOR
12fc0 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20  Y    */ 0,.     
12fd0 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20     /* WAL       
12fe0 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  */ 0.      };.  
12ff0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
13000 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73  r;   /* Pager as
13010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
13020 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58  t */.      needX
13030 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
13040 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13050 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
13060 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
13070 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
13080 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
13090 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[i].safety_lev
130a0 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el!=PAGER_SYNCHR
130b0 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20  ONOUS_OFF.      
130c0 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71   && aMJNeeded[sq
130d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
130e0 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
130f0 5d 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  ].       && sqli
13100 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
13110 70 50 61 67 65 72 29 3d 3d 30 0a 20 20 20 20 20  pPager)==0.     
13120 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73   ){ .        ass
13130 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20  ert( i!=1 );.   
13140 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20       nTrans++;. 
13150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
13160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
13170 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
13180 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
13190 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
131a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
131b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
131c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
131d0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
131e0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
131f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
13200 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
13210 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
13220 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
13230 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
13240 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
13250 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
13260 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
13270 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
13280 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
132a0 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
132b0 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
132c0 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
132d0 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
132e0 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
132f0 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
13300 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
13310 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
13320 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
13330 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
13340 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
13350 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
13360 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
13370 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
13380 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
13390 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
133a0 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
133b0 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
133c0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
133d0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
133e0 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
133f0 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
13400 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
13410 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
13420 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
13430 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
13440 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
13450 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
13460 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
13470 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
13480 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
13490 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
134a0 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
134b0 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
134c0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
134d0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
134e0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
134f0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
13500 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
13510 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
13520 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13530 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
13540 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
13550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13560 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
13570 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
13580 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
13590 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
135a0 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
135b0 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
135c0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
135d0 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
135e0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
135f0 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
13600 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
13610 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
13620 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
13630 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
13640 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
13650 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
13660 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
13670 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
13680 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
13690 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
136a0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
136b0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
136c0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
136d0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
136e0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
136f0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
13700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13710 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
13720 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
13730 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
13760 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
13770 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
13780 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
13790 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
137a0 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
137b0 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
137c0 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
137d0 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
137e0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
137f0 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
13800 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
13810 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79  itted atomically
13820 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
13830 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13840 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
13850 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
13860 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
13870 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
13880 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
13890 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
138a0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
138b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
138c0 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
138d0 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
138e0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
138f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
13900 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
13910 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
13920 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
13930 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
13940 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
13950 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
13960 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
13970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13980 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
13990 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
139a0 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
139b0 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
139c0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
139d0 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
139e0 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
139f0 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
13a00 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
13a10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13a20 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  PT;.    do {.   
13a30 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
13a40 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
13a50 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
13a60 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
13a70 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
13a80 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
13a90 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
13aa0 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
13ab0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
13ac0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13ad0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
13ae0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13af0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13b00 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
13b10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
13b20 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
13b30 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
13b40 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
13b50 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
13b60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
13b70 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
13b80 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
13b90 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
13ba0 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
13bb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
13bc0 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
13bd0 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
13be0 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
13c10 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
13c20 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
13c30 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
13c40 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
13c50 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
13c60 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13c70 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
13c80 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
13c90 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
13ca0 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
13cb0 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
13cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
13cd0 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
13ce0 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
13cf0 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
13d00 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
13d10 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
13d20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
13d30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
13d40 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
13d50 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
13d60 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
13d70 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
13d80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
13d90 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
13da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13db0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
13dc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
13dd0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
13de0 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
13df0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
13e00 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
13e10 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
13e20 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
13e30 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
13e40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
13e50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
13e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
13e70 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
13e80 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
13e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ea0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13eb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13ec0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
13ed0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
13ee0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13ef0 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
13f00 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
13f10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
13f20 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
13f30 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
13f40 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
13f50 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
13f60 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
13f70 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
13f80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13f90 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
13fa0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
13fb0 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
13fc0 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
13fd0 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
13fe0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
13ff0 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
14000 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
14010 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
14020 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
14030 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
14040 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
14050 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
14060 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
14070 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
14080 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
14090 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
140a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
140b0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
140c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
140d0 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
140e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
140f0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
14100 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
14110 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
14120 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
14130 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
14140 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14150 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
14160 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14170 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
14180 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
14190 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
141a0 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
141b0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
141c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
141d0 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
141e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
141f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14200 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14210 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
14220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14230 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
14240 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
14250 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14260 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
14270 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
14280 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
14290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
142a0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
142b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
142c0 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
142d0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
142e0 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
142f0 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
14300 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
14310 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   */.    if( 0==(
14320 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
14330 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
14340 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
14350 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
14360 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
14370 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
14380 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
14390 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
143a0 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
143b0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
143c0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
143d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
143e0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
143f0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
14400 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14410 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
14420 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14430 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
14440 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
14450 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
14460 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
14470 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
14480 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
14490 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
144a0 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
144b0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
144c0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
144d0 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
144e0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
144f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14500 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
14510 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
14520 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
14530 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
14540 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
14550 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
14560 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
14570 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
14580 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
14590 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
145a0 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
145b0 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
145c0 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
145d0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
145e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
145f0 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
14600 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
14610 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
14620 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
14630 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
14640 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
14650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14660 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
14670 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
14680 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
14690 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
146a0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
146b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
146c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
146d0 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
146e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
146f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
14700 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
14710 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
14720 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
14730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14750 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
14760 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
14770 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
14780 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
14790 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
147a0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
147b0 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
147c0 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
147d0 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
147e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
147f0 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
14800 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
14810 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
14820 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
14830 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
14840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14850 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
14860 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
14870 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14880 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
14890 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
148a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
148b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
148c0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
148d0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
148e0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
148f0 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
14900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
14910 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
14920 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
14930 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
14940 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
14950 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
14960 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
14970 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
14980 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
14990 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
149a0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
149b0 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
149c0 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
149d0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
149e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
149f0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
14a00 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
14a10 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
14a20 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
14a30 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
14a40 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
14a50 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
14a60 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
14a70 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
14a80 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
14a90 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
14aa0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14ab0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
14ac0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14ad0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
14ae0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
14af0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
14b00 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
14b10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14b20 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
14b30 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
14b40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14b50 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
14b60 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
14b70 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
14b80 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
14b90 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
14ba0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
14bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14bc0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
14bd0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
14be0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
14bf0 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
14c00 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
14c10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
14c20 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
14c30 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
14c40 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
14c50 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
14c60 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
14c70 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
14c80 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
14c90 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
14ca0 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
14cb0 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
14cc0 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
14cd0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
14ce0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
14cf0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
14d00 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
14d10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
14d20 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
14d30 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
14d40 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
14d50 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
14d60 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
14d70 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
14d80 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
14d90 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
14da0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
14db0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
14dc0 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
14dd0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
14de0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
14df0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
14e00 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
14e10 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
14e20 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
14e30 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
14e40 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
14e50 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
14e60 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
14e70 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
14e80 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
14e90 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
14ea0 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
14eb0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
14ec0 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
14ed0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
14ee0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
14ef0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
14f00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
14f10 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
14f20 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
14f30 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
14f40 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
14f50 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
14f60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14f70 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
14f80 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
14f90 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
14fa0 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
14fb0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
14fc0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
14fd0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
14fe0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
14ff0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
15000 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
15010 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
15020 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
15030 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
15040 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
15050 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
15060 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
15070 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
15080 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
15090 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
150a0 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53  E int vdbeCloseS
150b0 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
150c0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
150d0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
150e0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
150f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15100 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
15110 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
15120 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
15130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  ;..  assert( eOp
15140 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
15150 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
15160 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
15170 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
15180 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
15190 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
151a0 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
151b0 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
151c0 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f  epoint) );..  fo
151d0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
151e0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74  ; i++){ .    int
151f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
15200 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
15210 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
15220 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
15230 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
15240 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
15250 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
15260 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
15270 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
15280 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
15290 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
152a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
152b0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
152c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
152d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
152e0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
152f0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
15300 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
15310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15330 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
15340 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
15350 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74  .  }.  db->nStat
15360 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53  ement--;.  p->iS
15370 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
15380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15390 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f  OK ){.    if( eO
153a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
153b0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  LBACK ){.      r
153c0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
153d0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
153e0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
153f0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
15400 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
15410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
15430 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
15440 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
15450 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
15460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15470 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
15480 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
15490 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
154a0 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
154b0 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
154c0 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
154d0 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
154e0 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
154f0 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
15500 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65   .  ** the state
15510 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15520 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
15530 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45  .  if( eOp==SAVE
15540 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
15550 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
15560 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
15570 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64  mtDefCons;.    d
15580 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
15590 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
155a0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20  fImmCons;.  }.  
155b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
155c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
155d0 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
155e0 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
155f0 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74  if( p->db->nStat
15600 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
15610 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65  tement ){.    re
15620 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74  turn vdbeCloseSt
15630 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b  atement(p, eOp);
15640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15650 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
15660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15670 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15680 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
15690 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
156a0 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
156b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
156c0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
156d0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
156e0 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
156f0 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
15700 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
15710 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
15720 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
15730 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
15740 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
15750 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
15760 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
15770 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
15780 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
15790 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
157a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
157b0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
157c0 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
157d0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
157e0 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
157f0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a  AINT_FOREIGNKEY.
15800 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20  ** and write an 
15810 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
15820 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
15830 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
15840 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
15850 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
15860 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
15870 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
15880 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
15890 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
158a0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
158b0 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e  eferred && (db->
158c0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62  nDeferredCons+db
158d0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
158e0 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21  ns)>0) .   || (!
158f0 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e  deferred && p->n
15900 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20  FkConstraint>0) 
15910 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  .  ){.    p->rc 
15920 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
15930 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
15940 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
15950 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
15960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
15970 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20  ror(p, "FOREIGN 
15980 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
15990 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ailed");.    ret
159a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
159b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
159c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
159d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
159e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
159f0 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
15a00 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
15a10 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
15a20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
15a30 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
15a40 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
15a50 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
15a60 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
15a70 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
15a80 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
15a90 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
15aa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15ab0 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
15ac0 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
15ad0 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
15ae0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
15af0 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
15b00 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
15b10 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
15b20 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
15b30 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
15b40 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
15b50 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
15b60 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
15b70 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
15b80 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
15b90 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
15ba0 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
15bb0 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
15bc0 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
15bd0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
15be0 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
15bf0 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
15c00 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
15c10 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
15c20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15c30 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
15c40 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
15c70 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74   store transient
15c80 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f   return codes */
15c90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15ca0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68   p->db;..  /* Th
15cb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
15cc0 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
15cd0 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
15ce0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
15cf0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
15d00 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
15d10 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
15d20 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
15d30 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
15d40 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
15d50 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
15d60 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
15d70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15d80 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
15d90 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
15da0 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
15db0 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
15dc0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
15dd0 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
15de0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
15df0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
15e00 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
15e10 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
15e20 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
15e30 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
15e40 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
15e50 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
15e60 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
15e70 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
15e80 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
15e90 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
15ea0 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
15eb0 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
15ec0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
15ed0 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  /..  if( p->magi
15ee0 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
15ef0 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
15f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15f10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
15f20 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
15f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15f40 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c  M_BKPT;.  }.  cl
15f50 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
15f60 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
15f70 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
15f80 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
15f90 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
15fa0 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
15fb0 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69  ver started or i
15fc0 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73  f the.  ** SQL s
15fd0 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  tatement does no
15fe0 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  t read or write 
15ff0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
16000 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
16010 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61  >=0 && p->bIsRea
16020 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  der ){.    int m
16030 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
16040 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
16050 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
16060 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
16070 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
16080 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
16090 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
160a0 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
160b0 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
160c0 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
160d0 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
160e0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
160f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
16100 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter(p);..    /* 
16110 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66  Check for one of
16120 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
16130 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ors */.    mrc =
16140 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
16150 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
16160 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
16170 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
16180 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
161b0 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
161c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
161d0 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
161e0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
161f0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
16200 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
16210 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
16220 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
16230 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
16240 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
16250 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
16260 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
16270 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
16280 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
16290 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
162a0 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
162b0 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
162c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
162d0 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
162e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
162f0 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
16300 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
16310 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
16320 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
16330 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
16340 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
16350 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
16360 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
16370 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
16380 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
16390 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
163a0 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
163b0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
163c0 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
163d0 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
163e0 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
163f0 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
16400 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
16410 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
16420 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
16430 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
16440 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
16450 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
16460 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
16470 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
16480 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
16490 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
164a0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
164b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
164c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
164d0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
164e0 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
164f0 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
16500 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
16510 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
16520 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
16530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16540 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
16550 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
16560 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
16570 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
16580 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
16590 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
165a0 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
165b0 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
165c0 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
165d0 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
165e0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
165f0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
16600 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
16610 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
16620 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
16630 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
16640 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
16650 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
16660 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
16670 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
16680 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16690 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
166a0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
166b0 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
166c0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
166d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
166e0 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
166f0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
16700 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
16710 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16720 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
16730 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
16740 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
16750 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
16760 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
16770 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
16780 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
16790 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
167a0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
167b0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
167c0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
167d0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
167e0 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
167f0 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
16800 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
16810 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
16820 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
16830 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
16840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16850 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
16860 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
16870 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
16880 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
16890 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
168a0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
168b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
168c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
168d0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
168e0 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
168f0 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
16900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16910 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
16920 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
16930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
16950 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
16960 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
16970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
16980 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
16990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
169a0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
169b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
169c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
169d0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
169e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
169f0 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
16a00 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
16a10 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
16a20 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
16a30 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
16a40 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
16a50 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
16a60 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
16a70 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
16a80 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
16a90 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
16aa0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
16ab0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
16ac0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
16ad0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
16ae0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
16af0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
16b00 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
16b10 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
16b20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
16b30 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
16b40 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
16b50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16b60 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
16b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16b80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16b90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16ba0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16bb0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
16bc0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
16bd0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
16be0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
16bf0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  K);.          p-
16c00 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16c20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
16c30 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
16c40 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
16c50 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
16c60 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
16c70 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53  flags &= ~(u64)S
16c80 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
16c90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16ca0 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
16cb0 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
16cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16cd0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
16ce0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16cf0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
16d00 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
16d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16d20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
16d30 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
16d40 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
16d50 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
16d60 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16d70 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
16d80 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
16d90 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
16da0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
16db0 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
16dc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
16dd0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
16de0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
16df0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
16e00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
16e10 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
16e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16e30 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16e40 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
16e50 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
16e60 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
16e70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
16e80 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
16e90 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  t = 1;.        p
16ea0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
16eb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
16ec0 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65      /* If eState
16ed0 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65  mentOp is non-ze
16ee0 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65  ro, then a state
16ef0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16f00 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
16f10 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
16f20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61   rolled back. Ca
16f30 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  ll sqlite3VdbeCl
16f40 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74  oseStatement() t
16f50 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20  o.    ** do so. 
16f60 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  If this operatio
16f70 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
16f80 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  or, and the curr
16f90 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ent statement.  
16fa0 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20    ** error code 
16fb0 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  is SQLITE_OK or 
16fc0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
16fd0 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20  T, then promote 
16fe0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
16ff0 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72  nt statement err
17000 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  or code..    */.
17010 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
17020 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63  ntOp ){.      rc
17030 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
17040 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
17050 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20  eStatementOp);. 
17060 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
17070 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
17080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
17090 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
170a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
170b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
170c0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
170d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
170e0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
170f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
17100 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
17110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17120 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
17130 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
17140 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
17150 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
17160 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
17170 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
17180 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
17190 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
171a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
171b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
171c0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
171d0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
171e0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
171f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
17200 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
17210 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
17220 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
17230 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
17240 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
17250 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
17260 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
17270 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
17280 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
17290 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
172a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
172b0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
172c0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
172d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
172e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
172f0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
17300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
17310 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
17320 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
17330 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
17340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
17350 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
17360 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
17370 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
17380 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
17390 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
173a0 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
173b0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
173c0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
173d0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
173e0 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
173f0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
17400 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
17410 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
17420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
17430 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
17440 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
17450 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17460 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
17470 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
17480 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
17490 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
174a0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
174b0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
174c0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
174d0 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
174e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
174f0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
17500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
17510 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
17520 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
17530 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
17540 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
17550 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
17560 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
17570 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
17580 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
17590 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
175a0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
175b0 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
175c0 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
175d0 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
175e0 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
175f0 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
17600 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
17610 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
17620 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
17630 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
17640 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
17650 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
17660 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
17670 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
17680 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
17690 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
176a0 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
176b0 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
176c0 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
176d0 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
176e0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
176f0 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
17700 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
17710 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
17720 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
17730 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
17740 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
17750 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
17760 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
17770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17780 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
17790 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
177a0 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
177b0 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
177c0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
177d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
177e0 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
177f0 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
17800 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
17810 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
17820 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
17830 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
17840 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
17850 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
17860 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
17870 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
17880 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
17890 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
178a0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
178b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
178c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
178d0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
178e0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
178f0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
17900 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
17910 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
17920 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42  sg ){.    db->bB
17930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20  enignMalloc++;. 
17940 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
17950 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
17960 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d     if( db->pErr=
17970 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20  =0 ) db->pErr = 
17980 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
17990 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
179a0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
179b0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
179c0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
179d0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
179e0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
179f0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
17a00 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e  ();.    db->bBen
17a10 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d  ignMalloc--;.  }
17a20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72  else if( db->pEr
17a30 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
17a40 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d  ValueSetNull(db-
17a50 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62  >pErr);.  }.  db
17a60 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
17a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17a80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17a90 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
17aa0 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43  * If an SQLITE_C
17ab0 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f  ONFIG_SQLLOG hoo
17ac0 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  k is registered 
17ad0 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  and the VM has b
17ae0 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76  een run, .** inv
17af0 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  oke it..*/.stati
17b00 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b  c void vdbeInvok
17b10 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29  eSqllog(Vdbe *v)
17b20 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  {.  if( sqlite3G
17b30 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
17b40 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51  log && v->rc==SQ
17b50 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53  LITE_OK && v->zS
17b60 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29  ql && v->pc>=0 )
17b70 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70  {.    char *zExp
17b80 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56  anded = sqlite3V
17b90 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20  dbeExpandSql(v, 
17ba0 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73  v->zSql);.    as
17bb0 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69  sert( v->db->ini
17bc0 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
17bd0 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29   if( zExpanded )
17be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17bf0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
17c00 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73  log(.          s
17c10 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17c20 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76  ig.pSqllogArg, v
17c30 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c  ->db, zExpanded,
17c40 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   1.      );.    
17c50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17c60 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
17c70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
17c80 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
17c90 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78  beInvokeSqllog(x
17ca0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17cb0 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
17cc0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
17cd0 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
17ce0 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
17cf0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
17d00 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
17d10 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
17d20 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
17d30 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
17d40 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
17d50 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
17d60 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
17d70 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
17d80 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
17d90 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
17da0 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
17db0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
17dc0 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
17dd0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
17de0 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
17df0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
17e00 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
17e10 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
17e20 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
17e30 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
17e40 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
17e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
17e60 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
17e70 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
17e80 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20  int i;.#endif.. 
17e90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
17ea0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
17eb0 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
17ec0 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
17ed0 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
17ee0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
17ef0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
17f00 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
17f10 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
17f20 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
17f30 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
17f40 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
17f50 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
17f60 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
17f70 65 6e 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  en run even part
17f80 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
17f90 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
17fa0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
17fb0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
17fc0 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
17fd0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
17fe0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
17ff0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
18000 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
18010 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
18020 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
18030 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
18040 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
18050 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
18060 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
18070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
18080 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
18090 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
180a0 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
180b0 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
180c0 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
180d0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 69 66 28  rror(p);.    if(
180e0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
180f0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
18100 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
18110 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
18120 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
18130 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
18140 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
18150 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
18160 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
18170 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
18180 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
18190 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
181a0 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
181b0 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
181c0 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
181d0 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
181e0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
181f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
18200 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
18210 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
18220 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
18230 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Msg);.  }..  /* 
18240 52 65 73 65 74 20 72 65 67 69 73 74 65 72 20 63  Reset register c
18250 6f 6e 74 65 6e 74 73 20 61 6e 64 20 72 65 63 6c  ontents and recl
18260 61 69 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67  aim error messag
18270 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23  e memory..  */.#
18280 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18290 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
182a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
182b0 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
182c0 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
182d0 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
182e0 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
182f0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
18300 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
18310 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  */.  if( p->apCs
18320 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
18330 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
18340 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
18350 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
18360 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
18370 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
18380 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
18390 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
183a0 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
183b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
183c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
183d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
183e0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
183f0 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
18400 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
18410 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e  ITE_DEBUG.  p->n
18420 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
18430 66 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  f..  /* Save pro
18440 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
18450 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
18460 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
18470 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
18480 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
18490 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
184a0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
184b0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
184c0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
184d0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
184e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
184f0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
18500 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
18510 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
18520 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
18530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
18540 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
18550 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
18560 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
18570 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
18580 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
18590 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
185a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
185b0 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
185c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
185d0 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
185e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
185f0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
18600 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
18610 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
18620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18630 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
18640 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
18650 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
18660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
18670 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
18680 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
18690 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
186a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
186b0 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
186c0 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
186d0 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
186e0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
186f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
18700 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
18710 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18720 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
18730 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
18740 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
18750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
18760 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
18770 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
18780 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
18790 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
187a0 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
187b0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
187c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
187d0 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
187e0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53  = VDBE_MAGIC_RES
187f0 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ET;.  return p->
18800 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
18810 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
18820 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
18830 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
18840 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
18850 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
18860 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
18870 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
18880 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
18890 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
188a0 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
188b0 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
188c0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
188d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
188e0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
188f0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
18900 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
18910 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
18920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18930 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
18940 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
18950 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
18960 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
18970 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
18980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18990 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
189a0 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
189b0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
189c0 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
189d0 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
189e0 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
189f0 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
18a00 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
18a10 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
18a20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
18a30 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
18a40 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
18a50 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
18a60 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
18a70 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
18a80 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
18a90 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
18aa0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
18ab0 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
18ac0 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
18ad0 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
18ae0 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
18af0 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
18b00 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
18b10 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
18b20 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
18b30 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
18b40 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
18b50 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
18b60 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
18b70 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
18b80 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
18b90 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
18ba0 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
18bb0 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
18bc0 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
18bd0 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
18be0 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
18bf0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
18c00 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
18c10 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
18c20 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
18c30 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c 69  leteAuxData(sqli
18c40 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61  te3 *db, AuxData
18c50 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20   **pp, int iOp, 
18c60 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69  int mask){.  whi
18c70 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
18c80 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
18c90 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
18ca0 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
18cb0 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20  x->iAuxOp==iOp. 
18cc0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75 78           && pAux
18cd0 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20  ->iAuxArg>=0.   
18ce0 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78 2d         && (pAux-
18cf0 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21  >iAuxArg>31 || !
18d00 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
18d10 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29  2(pAux->iAuxArg)
18d20 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
18d30 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
18d40 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a  >iAuxArg==31 );.
18d50 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
18d60 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20  xDeleteAux ){.  
18d70 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
18d80 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75  eteAux(pAux->pAu
18d90 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
18da0 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
18db0 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71  extAux;.      sq
18dc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18dd0 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
18de0 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
18df0 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
18e00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18e10 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
18e20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18e30 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
18e40 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
18e50 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
18e60 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
18e70 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
18e80 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
18e90 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
18ea0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
18eb0 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
18ec0 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
18ed0 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
18ee0 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
18ef0 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
18f00 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
18f10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
18f20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
18f30 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
18f40 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
18f50 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
18f60 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
18f70 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
18f80 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
18f90 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
18fa0 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72   *pNext;.  asser
18fb0 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
18fc0 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
18fd0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
18fe0 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
18ff0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
19000 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
19010 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
19020 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
19030 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
19040 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
19050 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
19060 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
19070 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
19080 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
19090 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ub);.  }.  if( p
190a0 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
190b0 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
190c0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
190d0 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
190e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
190f0 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69  Free(db, p->pVLi
19100 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
19110 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
19120 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  ree);.  }.  vdbe
19130 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
19140 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
19150 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19160 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
19170 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
19180 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
19190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
191a0 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a  NABLE_NORMALIZE.
191b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
191c0 64 62 2c 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29  db, p->zNormSql)
191d0 3b 0a 20 20 7b 0a 20 20 20 20 44 62 6c 71 75 6f  ;.  {.    Dblquo
191e0 74 65 53 74 72 20 2a 70 54 68 69 73 2c 20 2a 70  teStr *pThis, *p
191f0 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 54  Next;.    for(pT
19200 68 69 73 3d 70 2d 3e 70 44 62 6c 53 74 72 3b 20  his=p->pDblStr; 
19210 70 54 68 69 73 3b 20 70 54 68 69 73 3d 70 4e 65  pThis; pThis=pNe
19220 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
19230 20 3d 20 70 54 68 69 73 2d 3e 70 4e 65 78 74 53   = pThis->pNextS
19240 74 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  tr;.      sqlite
19250 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 68 69  3DbFree(db, pThi
19260 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  s);.    }.  }.#e
19270 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
19280 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
19290 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20  CANSTATUS.  {.  
192a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
192b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
192c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
192d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
192e0 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
192f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
19300 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19310 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23  p->aScan);.  }.#
19320 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
19330 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
19340 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
19350 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
19360 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
19370 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65  te3 *db;..  asse
19380 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
19390 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
193a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
193b0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
193c0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
193d0 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
193e0 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
193f0 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
19400 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
19410 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
19420 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
19430 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
19440 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
19450 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
19460 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
19470 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
19480 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
19490 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
194a0 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
194b0 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
194c0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
194d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
194e0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
194f0 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
19500 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
19510 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
19520 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
19530 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
19540 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
19550 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
19560 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
19570 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
19580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19590 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
195a0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
195b0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
195c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
195d0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
195e0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
195f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
19600 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
19610 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
19620 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
19630 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
19640 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
19650 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
19660 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
19670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
19680 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
19690 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  d(p->uc.pCursor,
196a0 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
196b0 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
196c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
196d0 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d   rc;.  if( res!=
196e0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
196f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19710 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
19720 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
19730 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65  dif.  p->deferre
19740 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
19750 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
19760 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72  CACHE_STALE;.  r
19770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68  .}../*.** Someth
19790 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75  ing has moved cu
197a0 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20  rsor "p" out of 
197b0 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68  place.  Maybe th
197c0 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20  e row it was.** 
197d0 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64  pointed to was d
197e0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
197f0 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61  under it.  Or ma
19800 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61  ybe the btree wa
19810 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e  s.** rebalanced.
19820 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63    Whatever the c
19830 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73  ause, try to res
19840 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20  tore "p" to the 
19850 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73  place it.** is s
19860 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f  upposed to be po
19870 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  inting.  If the 
19880 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20  row was deleted 
19890 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
198a0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65  he.** cursor, se
198b0 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
198c0 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20  point to a NULL 
198d0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
198e0 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
198f0 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  NE handleMovedCu
19900 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20  rsor(VdbeCursor 
19910 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66  *p){.  int isDif
19920 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20  ferentRow, rc;. 
19930 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
19940 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
19950 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
19960 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d   p->uc.pCursor!=
19970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
19980 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19990 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
199a0 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
199b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
199c0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
199d0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  uc.pCursor, &isD
199e0 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
199f0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
19a00 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
19a10 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
19a20 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
19a30 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
19a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
19a50 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
19a60 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
19a70 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
19a80 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
19a90 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
19aa0 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
19ab0 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
19ac0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
19ad0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
19ae0 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
19af0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
19b00 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
19b10 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
19b20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
19b30 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
19b40 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
19b50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
19b60 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
19b70 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
19b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19b90 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
19ba0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
19bb0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
19bc0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
19bd0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
19be0 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
19bf0 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
19c00 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
19c10 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
19c20 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
19c30 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
19c40 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
19c50 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
19c60 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
19c70 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
19c80 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
19c90 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
19ca0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
19cb0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
19cc0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
19cd0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
19ce0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
19cf0 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
19d00 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
19d10 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
19d20 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
19d30 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
19d40 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
19d50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
19d60 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
19d70 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
19d80 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
19d90 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
19da0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
19db0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
19dc0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
19dd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19de0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
19df0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
19e00 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
19e10 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43  r **pp, int *piC
19e20 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  ol){.  VdbeCurso
19e30 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73  r *p = *pp;.  as
19e40 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
19e50 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
19e60 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79 70 65 3d   || p->eCurType=
19e70 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
19e80 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  );.  if( p->defe
19e90 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
19ea0 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20    int iMap;.    
19eb0 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26  if( p->aAltMap &
19ec0 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c  & (iMap = p->aAl
19ed0 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e  tMap[1+*piCol])>
19ee0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  0 ){.      *pp =
19ef0 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a   p->pAltCursor;.
19f00 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
19f10 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 72  Map - 1;.      r
19f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19f30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
19f40 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
19f50 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20  Moveto(p);.  }. 
19f60 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
19f70 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
19f80 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
19f90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
19fa0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
19fb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19fd0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19fe0 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
19ff0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1a000 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
1a010 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1a020 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
1a030 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
1a040 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
1a050 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
1a060 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a070 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
1a080 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
1a090 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
1a0a0 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
1a0b0 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
1a0c0 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
1a0d0 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
1a0e0 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
1a0f0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
1a100 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
1a110 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
1a120 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
1a130 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
1a140 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
1a150 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
1a160 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
1a170 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
1a180 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
1a190 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
1a1a0 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
1a1b0 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
1a1c0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
1a1d0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
1a1e0 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
1a1f0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
1a200 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
1a210 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
1a220 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
1a230 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
1a240 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
1a250 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
1a260 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
1a270 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
1a280 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
1a290 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
1a2a0 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
1a2b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1a2c0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
1a2d0 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
1a2e0 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
1a2f0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
1a300 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
1a310 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
1a320 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
1a330 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1a340 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
1a350 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1a360 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
1a370 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
1a380 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
1a390 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
1a3a0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1a3b0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1a3c0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
1a3d0 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
1a400 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
1a410 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
1a420 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
1a430 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
1a440 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
1a470 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
1a480 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
1a4b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
1a4c0 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
1a4d0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
1a4e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
1a4f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
1a520 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
1a530 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
1a540 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
1a550 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
1a560 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
1a570 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
1a580 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
1a590 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
1a5a0 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
1a5b0 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
1a5e0 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
1a5f0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
1a600 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
1a610 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
1a620 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
1a630 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
1a640 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
1a650 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
1a660 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
1a670 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
1a680 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
1a690 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
1a6a0 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
1a6b0 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
1a6c0 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 23 69  al types..*/..#i
1a6d0 66 20 30 20 2f 2a 20 49 6e 6c 69 6e 65 64 20 69  f 0 /* Inlined i
1a6e0 6e 74 6f 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  nto the OP_MakeR
1a6f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 2a 2f 0a  ecord opcode */.
1a700 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a710 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
1a720 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
1a730 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  d in pMem..**.**
1a740 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
1a750 67 68 74 20 63 6f 6e 76 65 72 74 20 61 20 6c 61  ght convert a la
1a760 72 67 65 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20  rge MEM_IntReal 
1a770 76 61 6c 75 65 20 69 6e 74 6f 20 4d 45 4d 5f 52  value into MEM_R
1a780 65 61 6c 2e 0a 2a 2a 0a 2a 2a 20 32 30 31 39 2d  eal..**.** 2019-
1a790 30 37 2d 31 31 3a 20 20 54 68 65 20 70 72 69 6d  07-11:  The prim
1a7a0 61 72 79 20 75 73 65 72 20 6f 66 20 74 68 69 73  ary user of this
1a7b0 20 73 75 62 72 6f 75 74 69 6e 65 20 77 61 73 20   subroutine was 
1a7c0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1a7d0 64 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 20 74  d.** opcode in t
1a7e0 68 65 20 62 79 74 65 2d 63 6f 64 65 20 65 6e 67  he byte-code eng
1a7f0 69 6e 65 2e 20 20 42 75 74 20 62 79 20 6d 6f 76  ine.  But by mov
1a800 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a810 20 69 6e 2d 6c 69 6e 65 2c 20 77 65 0a 2a 2a 20   in-line, we.** 
1a820 63 61 6e 20 6f 6d 69 74 20 73 6f 6d 65 20 72 65  can omit some re
1a830 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 61 6e  dundant tests an
1a840 64 20 6d 61 6b 65 20 74 68 61 74 20 6f 70 63 6f  d make that opco
1a850 64 65 20 61 20 6c 6f 74 20 66 61 73 74 65 72 2e  de a lot faster.
1a860 20 20 53 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75    So.** this rou
1a870 74 69 6e 65 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tine is now only
1a880 20 75 73 65 64 20 62 79 20 74 68 65 20 53 54 41   used by the STA
1a890 54 33 20 6c 6f 67 69 63 20 61 6e 64 20 53 54 41  T3 logic and STA
1a8a0 54 33 20 73 75 70 70 6f 72 74 20 68 61 73 0a 2a  T3 support has.*
1a8b0 2a 20 65 6e 64 65 64 2e 20 20 54 68 65 20 63 6f  * ended.  The co
1a8c0 64 65 20 69 73 20 6b 65 70 74 20 68 65 72 65 20  de is kept here 
1a8d0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
1a8e0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 0a 2a  eference only..*
1a8f0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
1a900 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
1a910 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
1a920 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65  format, u32 *pLe
1a930 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  n){.  int flags 
1a940 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
1a950 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72   u32 n;..  asser
1a960 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20  t( pLen!=0 );.  
1a970 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
1a980 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  ll ){.    *pLen 
1a990 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1a9a0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
1a9b0 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1a9c0 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  IntReal) ){.    
1a9d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
1a9e0 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
1a9f0 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
1aa00 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
1aa10 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
1aa20 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
1aa30 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
1aa40 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
1aa50 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 74 65     u64 u;.    te
1aa60 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1aa70 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74  MEM_Int );.    t
1aa80 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1aa90 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a   MEM_IntReal );.
1aaa0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
1aab0 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
1aac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
1aad0 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
1aae0 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
1aaf0 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
1ab00 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
1ab10 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
1ab20 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
1ab30 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
1ab40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ab50 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
1ab60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ab70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ab80 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
1ab90 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
1aba0 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
1abb0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
1abc0 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
1abd0 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
1abe0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
1abf0 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
1ac00 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
1ac10 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
1ac20 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
1ac30 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
1ac40 6e 20 3d 20 38 3b 0a 20 20 20 20 69 66 28 20 66  n = 8;.    if( f
1ac50 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 52 65 61 6c  lags&MEM_IntReal
1ac60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1ac70 74 68 65 20 76 61 6c 75 65 20 69 73 20 49 6e 74  the value is Int
1ac80 52 65 61 6c 20 61 6e 64 20 69 73 20 67 6f 69 6e  Real and is goin
1ac90 67 20 74 6f 20 74 61 6b 65 20 75 70 20 38 20 62  g to take up 8 b
1aca0 79 74 65 73 20 74 6f 20 73 74 6f 72 65 0a 20 20  ytes to store.  
1acb0 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74      ** as an int
1acc0 65 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6d 69  eger, then we mi
1acd0 67 68 74 20 61 73 20 77 65 6c 6c 20 6d 61 6b 65  ght as well make
1ace0 20 69 74 20 61 6e 20 38 2d 62 79 74 65 20 66 6c   it an 8-byte fl
1acf0 6f 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  oating.      ** 
1ad00 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20  point value */. 
1ad10 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d       pMem->u.r =
1ad20 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75   (double)pMem->u
1ad30 2e 69 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .i;.      pMem->
1ad40 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e  flags &= ~MEM_In
1ad50 74 52 65 61 6c 3b 0a 20 20 20 20 20 20 70 4d 65  tReal;.      pMe
1ad60 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
1ad70 52 65 61 6c 3b 0a 20 20 20 20 20 20 72 65 74 75  Real;.      retu
1ad80 72 6e 20 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 7;.    }.    
1ad90 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
1ada0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
1adb0 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  al ){.    *pLen 
1adc0 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
1add0 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
1ade0 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
1adf0 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
1ae00 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
1ae10 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ob) );.  assert(
1ae20 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20   pMem->n>=0 );. 
1ae30 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e   n = (u32)pMem->
1ae40 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
1ae50 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1ae60 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
1ae70 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e  ero;.  }.  *pLen
1ae80 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28   = n;.  return (
1ae90 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
1aea0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
1aeb0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
1aec0 69 6e 6c 69 6e 65 64 20 69 6e 74 6f 20 4f 50 5f  inlined into OP_
1aed0 4d 61 6b 65 52 65 63 6f 72 64 20 2a 2f 0a 0a 2f  MakeRecord */../
1aee0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
1aef0 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
1af00 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
1af10 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
1af20 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1af30 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
1af40 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
1af50 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
1af60 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
1af70 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
1af80 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
1af90 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
1afa0 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
1afb0 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
1afc0 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
1afd0 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
1afe0 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
1aff0 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
1b000 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
1b010 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
1b020 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
1b030 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
1b040 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
1b050 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
1b060 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
1b070 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
1b080 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
1b090 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
1b0a0 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
1b0b0 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
1b0c0 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
1b0d0 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
1b0e0 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
1b0f0 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
1b100 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
1b110 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
1b120 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
1b130 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
1b140 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
1b150 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
1b160 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
1b170 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
1b180 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
1b190 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
1b1a0 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
1b1b0 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
1b1c0 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
1b1d0 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
1b1e0 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
1b1f0 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
1b200 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
1b210 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
1b220 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
1b230 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1b240 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
1b250 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
1b260 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b270 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
1b280 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
1b290 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
1b2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
1b2b0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1b2c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1b2d0 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
1b2e0 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
1b2f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
1b300 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1b310 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
1b320 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
1b330 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1b340 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
1b350 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
1b360 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
1b370 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
1b380 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
1b390 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
1b3a0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1b3b0 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
1b3c0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1b3d0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1b3e0 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
1b3f0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
1b400 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
1b410 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
1b420 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
1b430 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
1b440 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
1b450 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
1b460 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
1b470 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
1b480 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
1b490 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
1b4a0 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
1b4b0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
1b4c0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
1b4d0 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
1b4e0 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
1b4f0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
1b500 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
1b510 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
1b520 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
1b530 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
1b540 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
1b550 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
1b560 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
1b570 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
1b580 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
1b590 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
1b5a0 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
1b5b0 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
1b5c0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1b5d0 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1b5e0 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1b5f0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1b600 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1b610 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1b620 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1b630 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1b640 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1b650 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1b660 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1b670 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1b680 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1b690 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1b6a0 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1b6b0 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1b6c0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1b6d0 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1b6e0 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1b6f0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1b700 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1b710 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1b720 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1b730 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1b740 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1b750 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b760 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1b770 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1b780 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1b790 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1b7a0 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1b7b0 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1b7c0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1b7d0 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1b7e0 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1b7f0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1b800 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1b810 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1b820 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1b830 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1b840 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1b850 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1b860 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1b870 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1b880 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1b890 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1b8a0 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1b8b0 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1b8c0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1b8d0 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1b8e0 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1b8f0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1b900 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1b910 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1b920 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1b930 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1b940 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1b950 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1b960 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1b970 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1b980 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1b990 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1b9a0 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1b9b0 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1b9c0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1b9d0 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1b9e0 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1b9f0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1ba00 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1ba10 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1ba20 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1ba30 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1ba40 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1ba50 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1ba60 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1ba70 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1ba80 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1ba90 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1baa0 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1bab0 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1bac0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1bad0 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1bae0 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1baf0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1bb00 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1bb10 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1bb20 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1bb30 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1bb40 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1bb50 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1bb60 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1bb70 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1bb80 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1bb90 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1bba0 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1bbb0 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1bbc0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1bbd0 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1bbe0 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1bbf0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1bc00 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1bc10 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1bc20 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1bc30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1bc40 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1bc50 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1bc60 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1bc70 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1bc80 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1bc90 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1bca0 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1bcb0 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1bcc0 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1bcd0 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1bce0 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1bcf0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1bd00 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1bd10 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1bd20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1bd30 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1bd40 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1bd50 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1bd60 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1bd70 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1bd80 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1bd90 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1bda0 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1bdb0 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1bdc0 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1bdd0 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1bde0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1bdf0 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1be00 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1be10 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1be20 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1be30 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1be40 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1be50 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1be60 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1be70 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1be80 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1be90 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1bea0 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1beb0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1bec0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1bed0 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1bee0 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1bef0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1bf00 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1bf10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1bf20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1bf30 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1bf40 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1bf50 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1bf60 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1bf70 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1bf80 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1bf90 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1bfa0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1bfb0 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1bfc0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1bfd0 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1bfe0 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1bff0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1c000 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c010 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1c020 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1c030 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1c040 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1c050 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1c060 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1c070 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1c080 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1c090 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1c0a0 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1c0b0 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1c0c0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1c0d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1c0e0 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1c0f0 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1c100 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1c110 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1c120 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1c130 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1c140 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1c150 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1c160 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1c170 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1c180 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1c190 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1c1a0 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1c1b0 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1c1c0 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1c1d0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1c1e0 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1c1f0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1c200 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1c210 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1c220 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1c230 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1c240 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1c250 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1c260 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1c270 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1c280 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1c290 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1c2a0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1c2b0 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1c2c0 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1c2d0 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1c2e0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1c2f0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1c300 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1c310 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1c320 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1c330 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1c340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1c350 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1c360 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c370 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1c380 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1c390 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1c3a0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1c3b0 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1c3c0 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1c3d0 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1c3e0 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1c3f0 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1c400 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1c410 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1c420 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1c430 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1c440 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1c450 0a 73 74 61 74 69 63 20 75 33 32 20 73 65 72 69  .static u32 seri
1c460 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1c470 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1c480 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1c490 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1c4a0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1c4b0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1c4c0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1c4d0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1c4e0 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1c4f0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1c500 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1c510 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1c520 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1c530 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1c540 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1c550 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1c560 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1c570 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1c580 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1c590 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1c5a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c5b0 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1c5c0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c5d0 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1c5e0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1c5f0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1c600 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1c610 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1c620 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1c630 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1c640 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1c660 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c670 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1c680 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1c690 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1c6a0 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1c6b0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1c6c0 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1c6d0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1c6e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1c6f0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c700 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1c710 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1c720 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1c730 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1c740 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1c750 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1c760 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1c770 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1c780 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1c790 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1c7a0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1c7b0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1c7c0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1c7d0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1c7e0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1c7f0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1c800 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1c810 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1c820 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1c830 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1c840 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1c850 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1c860 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1c870 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1c880 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1c890 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1c8a0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1c8b0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1c8c0 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1c8d0 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1c8e0 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1c8f0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1c900 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1c910 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1c920 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1c930 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1c940 49 73 4e 61 4e 28 78 29 20 3f 20 4d 45 4d 5f 4e  IsNaN(x) ? MEM_N
1c950 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
1c960 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
1c970 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
1c980 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
1c990 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c9a0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1c9b0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1c9c0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1c9d0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9f0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1ca00 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1ca10 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca30 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1ca40 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1ca50 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
1ca60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1ca70 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f      case 10: { /
1ca80 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f  * Internal use o
1ca90 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76  nly: NULL with v
1caa0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
1cac0 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20  PDATE no-change 
1cad0 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20  flag set */.    
1cae0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1caf0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72  MEM_Null|MEM_Zer
1cb00 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  o;.      pMem->n
1cb10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
1cb20 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  ->u.nZero = 0;. 
1cb30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb40 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  }.    case 11:  
1cb50 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
1cb60 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
1cb70 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
1cb80 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
1cb90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1cba0 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
1cbb0 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
1cbc0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1cbd0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
1cbe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cbf0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
1cc00 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1cc10 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
1cc20 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
1cc30 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
1cc40 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
1cc50 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1cc60 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
1cc70 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1cc80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1cc90 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1cca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1ccb0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1ccc0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ccd0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1cce0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1ccf0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1cd00 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1cd10 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
1cd20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1cd30 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
1cd40 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1cd50 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1cd60 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1cd70 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
1cd80 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1cd90 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1cda0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1cdb0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1cdc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1cdd0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
1cde0 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1cdf0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1ce00 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1ce10 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
1ce20 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
1ce30 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
1ce40 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1ce50 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1ce60 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1ce70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
1ce80 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1ce90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1cea0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1ceb0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1cec0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1ced0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
1cee0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1cef0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1cf00 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1cf10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1cf20 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
1cf30 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1cf40 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
1cf50 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1cf60 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1cf70 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1cf80 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
1cf90 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f  T(buf);.#ifdef _
1cfa0 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a  _HP_cc .      /*
1cfb0 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73   Work around a s
1cfc0 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75  ign-extension bu
1cfd0 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70  g in the HP comp
1cfe0 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a  iler for HP/UX *
1cff0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b  /.      if( buf[
1d000 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e  0]&0x80 ) pMem->
1d010 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66  u.i |= 0xfffffff
1d020 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e  f80000000LL;.#en
1d030 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  dif.      pMem->
1d040 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1d050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d060 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1d070 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
1d080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1d090 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1d0a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1d0b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1d0c0 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
1d0d0 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
1d0e0 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
1d0f0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1d100 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1d110 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1d120 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1d130 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
1d140 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1d150 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
1d160 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1d170 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1d180 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d190 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1d1a0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
1d1b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1d1c0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
1d1d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1d1e0 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
1d1f0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
1d200 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
1d210 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
1d220 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
1d230 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
1d240 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
1d250 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
1d260 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
1d270 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
1d280 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1d290 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1d2a0 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
1d2b0 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
1d2c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d2d0 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
1d2e0 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
1d2f0 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
1d300 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
1d310 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
1d320 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
1d330 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
1d340 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
1d350 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
1d360 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
1d370 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
1d380 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1d390 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
1d3a0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
1d3b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1d3c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1d3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1d3e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
1d3f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1d400 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
1d410 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
1d420 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
1d430 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
1d440 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
1d450 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1d460 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
1d470 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
1d480 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1d490 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
1d4a0 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
1d4b0 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
1d4c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
1d4d0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
1d4e0 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
1d4f0 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
1d500 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
1d510 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
1d520 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
1d530 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1d540 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
1d550 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
1d560 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
1d570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1d580 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
1d590 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d5a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1d5b0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
1d5c0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
1d5d0 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
1d5e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
1d5f0 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
1d600 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
1d610 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
1d620 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1d630 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
1d640 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1d650 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
1d660 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
1d670 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
1d680 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
1d690 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1d6a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1d6b0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
1d6c0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
1d6d0 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
1d6e0 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
1d6f0 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
1d700 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
1d710 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
1d720 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
1d730 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
1d740 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
1d750 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
1d760 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
1d770 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1d780 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1d790 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
1d7a0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
1d7b0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
1d7c0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
1d7d0 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
1d7e0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
1d7f0 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
1d800 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1d810 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1d820 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
1d830 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
1d840 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
1d850 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1d860 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
1d870 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d890 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1d8a0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  he record */.){.
1d8b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d8c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1d8d0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
1d8e0 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
1d8f0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d920 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1d930 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74  for *p */.  nByt
1d940 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1d950 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1d960 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1d970 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  *(pKeyInfo->nKey
1d980 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20  Field+1);.  p = 
1d990 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1d9a0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1d9b0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1d9c0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
1d9d0 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1d9e0 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1d9f0 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1da00 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1da10 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1da20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1da30 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 21 3d 30  o->aSortFlags!=0
1da40 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1da50 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1da60 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1da70 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20  Info->nKeyField 
1da80 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1da90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1daa0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1dab0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1dac0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1dad0 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1dae0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1daf0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1db00 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1db10 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1db20 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1db30 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1db40 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1db50 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1db60 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1db70 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1db80 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1db90 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1dba0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1dbb0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1dbc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1dbd0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1dbe0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1dbf0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1dc00 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1dc10 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1dc20 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1dc30 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1dc40 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1dc50 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1dc60 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1dc70 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1dc80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1dc90 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32  ar *)pKey;.  u32
1dca0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1dcd0 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1dce0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1dcf0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd10 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1dd20 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1dd30 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1dd40 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1dd50 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1dd60 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1dd70 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1dd80 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1dd90 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1dda0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1ddb0 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1ddc0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1ddd0 73 7a 48 64 72 20 26 26 20 64 3c 3d 28 75 33 32  szHdr && d<=(u32
1dde0 29 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  )nKey ){.    u32
1ddf0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1de00 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1de10 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1de20 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1de30 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1de40 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1de50 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1de60 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1de70 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1de80 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1de90 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1dea0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1deb0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1dec0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1ded0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
1dee0 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
1def0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1df00 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
1df10 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
1df20 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28  Mem++;.    if( (
1df30 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20  ++u)>=p->nField 
1df40 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1df50 66 28 20 64 3e 28 75 33 32 29 6e 4b 65 79 20 26  f( d>(u32)nKey &
1df60 26 20 75 20 29 7b 0a 20 20 20 20 61 73 73 65 72  & u ){.    asser
1df70 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  t( CORRUPT_DB );
1df80 0a 20 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72  .    /* In a cor
1df90 72 75 70 74 20 72 65 63 6f 72 64 20 65 6e 74 72  rupt record entr
1dfa0 79 2c 20 74 68 65 20 6c 61 73 74 20 70 4d 65 6d  y, the last pMem
1dfb0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
1dfc0 20 73 65 74 20 75 70 20 75 73 69 6e 67 20 0a 20   set up using . 
1dfd0 20 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69     ** uninitiali
1dfe0 7a 65 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72  zed memory. Over
1dff0 77 72 69 74 65 20 69 74 73 20 76 61 6c 75 65 20  write its value 
1e000 77 69 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72  with NULL, to pr
1e010 65 76 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72  event.    ** war
1e020 6e 69 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e  nings from MSAN.
1e030 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1e040 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d  dbeMemSetNull(pM
1e050 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73  em-1);.  }.  ass
1e060 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
1e070 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20  ->nKeyField + 1 
1e080 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
1e090 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   u;.}..#ifdef SQ
1e0a0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1e0b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1e0c0 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
1e0d0 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
1e0e0 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
1e0f0 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
1e100 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e110 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
1e120 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
1e130 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
1e140 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1e150 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
1e160 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
1e170 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
1e180 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e190 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
1e1a0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
1e1b0 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
1e1c0 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
1e1d0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
1e1e0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
1e1f0 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
1e200 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
1e210 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e220 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
1e230 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
1e240 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
1e250 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1e260 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
1e270 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
1e280 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
1e290 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
1e2a0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
1e2b0 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
1e2c0 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
1e2d0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1e2e0 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
1e2f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e300 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1e310 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
1e320 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
1e330 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
1e340 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1e350 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
1e360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e370 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
1e380 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1e390 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e3a0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1e3b0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1e3c0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
1e3d0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
1e3e0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1e3f0 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
1e400 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1e410 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1e420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1e430 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
1e440 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1e450 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
1e460 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1e470 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1e480 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1e490 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
1e4a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1e4b0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
1e4c0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1e4d0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
1e4e0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
1e4f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
1e500 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1e510 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
1e520 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1e530 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
1e540 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
1e550 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
1e560 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
1e570 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
1e580 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1e590 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1e5a0 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1e5b0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e5c0 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
1e5d0 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
1e5e0 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
1e5f0 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
1e600 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1e610 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
1e620 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
1e630 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
1e640 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
1e650 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
1e660 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
1e670 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
1e680 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
1e690 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
1e6a0 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
1e6b0 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
1e6c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
1e6d0 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
1e6e0 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
1e6f0 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
1e700 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
1e710 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
1e720 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
1e730 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
1e740 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
1e750 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1e760 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
1e770 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
1e780 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
1e790 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
1e7a0 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
1e7b0 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
1e7c0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1e7d0 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
1e7e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1e7f0 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
1e800 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37  if( szHdr1>98307
1e810 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e820 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d  _CORRUPT;.  d1 =
1e830 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72   szHdr1;.  asser
1e840 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  t( pKeyInfo->nAl
1e850 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  lField>=pPKey2->
1e860 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1e870 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1e880 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1e890 74 46 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 61  tFlags!=0 );.  a
1e8a0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1e8b0 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a  >nKeyField>0 );.
1e8c0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1e8d0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1e8e0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1e8f0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1e900 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
1e910 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
1e920 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
1e930 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
1e940 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
1e950 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
1e960 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
1e970 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
1e980 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1e990 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1e9a0 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1e9b0 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1e9c0 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1e9d0 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1e9e0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1e9f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1ea00 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1ea10 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1ea20 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1ea30 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1ea40 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1ea50 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1ea60 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1ea70 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1ea80 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1ea90 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1eaa0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1eab0 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1eac0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1ead0 20 20 69 66 28 20 64 31 2b 28 75 36 34 29 73 65    if( d1+(u64)se
1eae0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36  rial_type1+2>(u6
1eaf0 34 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  4)nKey1.     && 
1eb00 64 31 2b 28 75 36 34 29 73 71 6c 69 74 65 33 56  d1+(u64)sqlite3V
1eb10 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1eb20 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1eb30 75 36 34 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u64)nKey1 .    )
1eb40 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1eb50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1eb60 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1eb70 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1eb80 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1eb90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1eba0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1ebb0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1ebc0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1ebd0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1ebe0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1ebf0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1ec00 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1ec10 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
1ec40 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20  ->nAllField>i ? 
1ec50 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1ec60 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
1ec70 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1ec80 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1ec90 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1eca0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1ecb0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  w */.      if( (
1ecc0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 46  pKeyInfo->aSortF
1ecd0 6c 61 67 73 5b 69 5d 20 26 20 4b 45 59 49 4e 46  lags[i] & KEYINF
1ece0 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 29  O_ORDER_BIGNULL)
1ecf0 0a 20 20 20 20 20 20 20 26 26 20 28 28 6d 65 6d  .       && ((mem
1ed00 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  1.flags & MEM_Nu
1ed10 6c 6c 29 20 7c 7c 20 28 70 50 4b 65 79 32 2d 3e  ll) || (pPKey2->
1ed20 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20  aMem[i].flags & 
1ed30 4d 45 4d 5f 4e 75 6c 6c 29 29 20 0a 20 20 20 20  MEM_Null)) .    
1ed40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20    ){.        rc 
1ed50 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1ed60 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1ed70 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d  o->aSortFlags[i]
1ed80 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52   & KEYINFO_ORDER
1ed90 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
1eda0 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1edb0 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1edc0 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1edd0 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1ede0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1edf0 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1ee00 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1ee10 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1ee20 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1ee30 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1ee40 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1ee50 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1ee60 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1ee70 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1ee80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1ee90 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1eea0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1eeb0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1eec0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1eed0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1eee0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1eef0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1ef00 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1ef10 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1ef20 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1ef30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1ef40 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1ef50 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1ef60 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1ef70 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1ef80 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1ef90 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1efa0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1efb0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1efc0 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1efd0 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1efe0 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1eff0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1f000 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1f010 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1f020 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1f030 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1f040 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1f050 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1f060 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1f070 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1f080 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1f090 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1f0a0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1f0b0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1f0c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1f0d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1f0e0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1f0f0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1f100 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
1f110 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
1f120 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
1f130 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
1f140 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
1f150 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
1f160 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1f170 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
1f180 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1f190 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
1f1a0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
1f1b0 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
1f1c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1f1d0 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
1f1e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f1f0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
1f200 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1f210 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
1f220 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
1f230 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
1f240 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
1f250 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
1f260 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
1f270 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
1f280 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  KeyField or KeyI
1f290 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61  nfo.nAllField va
1f2a0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1f2b0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1f2c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1f2d0 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1f2e0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1f2f0 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1f300 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1f310 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1f320 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1f330 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1f340 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1f350 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1f360 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1f370 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1f380 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1f390 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1f3a0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1f3b0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1f3c0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1f3d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f3e0 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1f3f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1f400 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1f410 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1f420 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1f430 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1f440 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1f450 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1f460 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1f470 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1f480 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1f490 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1f4a0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1f4b0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1f4c0 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  <= pKeyInfo->nAl
1f4d0 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73  lField );.}.#els
1f4e0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41  e.# define vdbeA
1f4f0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1f500 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c  ithinLimits(A,B,
1f510 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  C).#endif../*.**
1f520 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64   Both *pMem1 and
1f530 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20   *pMem2 contain 
1f540 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43  string values. C
1f550 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76  ompare the two v
1f560 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74  alues.** using t
1f570 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1f580 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20  uence pColl. As 
1f590 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20  usual, return a 
1f5a0 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a  negative , zero.
1f5b0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76  ** or positive v
1f5c0 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69  alue if *pMem1 i
1f5d0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1f5e0 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
1f5f0 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32   than .** *pMem2
1f600 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1f610 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69  Similar in spiri
1f620 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65  t to "rc = (*pMe
1f630 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22  m1) - (*pMem2);"
1f640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f650 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1f660 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65  ring(.  const Me
1f670 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73  m *pMem1,.  cons
1f680 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20  t Mem *pMem2,.  
1f690 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1f6a0 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45  Coll,.  u8 *prcE
1f6b0 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1f6c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
1f6d0 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74   OOM occurs, set
1f6e0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1f6f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65   */.){.  if( pMe
1f700 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e  m1->enc==pColl->
1f710 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  enc ){.    /* Th
1f720 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c  e strings are al
1f730 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72  ready in the cor
1f740 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20  rect encoding.  
1f750 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a  Call the.     **
1f760 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1f770 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f  tion directly */
1f780 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  .    return pCol
1f790 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1f7a0 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d  User,pMem1->n,pM
1f7b0 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c  em1->z,pMem2->n,
1f7c0 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c  pMem2->z);.  }el
1f7d0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
1f7e0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
1f7f0 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d  v1, *v2;.    Mem
1f800 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b   c1;.    Mem c2;
1f810 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f820 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65  MemInit(&c1, pMe
1f830 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1f840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f850 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70  beMemInit(&c2, p
1f860 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1f870 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1f880 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1f890 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
1f8a0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
1f8b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1f8c0 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
1f8d0 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
1f8e0 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
1f8f0 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1f900 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
1f910 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1f920 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1f930 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1f940 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1f950 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28  l->enc);.    if(
1f960 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1f970 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1f980 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20  rcErr ) *prcErr 
1f990 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1f9a0 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  KPT;.      rc = 
1f9b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f9c0 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
1f9d0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1f9e0 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e  r, c1.n, v1, c2.
1f9f0 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20  n, v2);.    }.  
1fa00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1fa10 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1fa20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1fa30 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1fa40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fa50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  .}../*.** The in
1fa60 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61  put pBlob is gua
1fa70 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
1fa80 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74  Blob that is not
1fa90 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20   marked.** with 
1faa0 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72  MEM_Zero.  Retur
1fab0 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75  n true if it cou
1fac0 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f  ld be a zero-blo
1fad0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
1fae0 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74   isAllZero(const
1faf0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
1fb00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1fb10 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
1fb20 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20  .    if( z[i] ) 
1fb30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1fb40 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1fb50 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1fb60 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1fb70 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1fb80 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1fb90 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1fba0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1fbb0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1fbc0 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1fbd0 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1fbe0 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1fbf0 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1fc00 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1fc10 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1fc20 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e  sor..*/.SQLITE_N
1fc30 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1fc40 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1fc50 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1fc60 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1fc70 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
1fc80 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e  1 = pB1->n;.  in
1fc90 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a  t n2 = pB2->n;..
1fca0 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
1fcb0 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c  ble to have a Bl
1fcc0 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  ob value that ha
1fcd0 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20  s some non-zero 
1fce0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c  content.  ** fol
1fcf0 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f  lowed by zero co
1fd00 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74  ntent.  But that
1fd10 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66   only comes up f
1fd20 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a  or Blobs formed.
1fd30 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d    ** by the OP_M
1fd40 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1fd50 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73  , and such Blobs
1fd60 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65   never get passe
1fd70 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1fd80 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e  te3MemCompare().
1fd90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1fda0 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1fdb0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d  Zero)==0 || n1==
1fdc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1fdd0 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1fde0 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d  _Zero)==0 || n2=
1fdf0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42  =0 );..  if( (pB
1fe00 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c  1->flags|pB2->fl
1fe10 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  ags) & MEM_Zero 
1fe20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e  ){.    if( pB1->
1fe30 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61  flags & pB2->fla
1fe40 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1fe50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1fe60 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32  1->u.nZero - pB2
1fe70 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1fe80 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c  else if( pB1->fl
1fe90 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1fea0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1feb0 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70  llZero(pB2->z, p
1fec0 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B2->n) ) return 
1fed0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1fee0 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1fef0 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n2;.    }else{. 
1ff00 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1ff10 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d  ero(pB1->z, pB1-
1ff20 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  >n) ) return +1;
1ff30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31  .      return n1
1ff40 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1ff50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d  .    }.  }.  c =
1ff60 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1ff70 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20  pB2->z, n1>n2 ? 
1ff80 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20  n2 : n1);.  if( 
1ff90 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1ffa0 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a  return n1 - n2;.
1ffb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1ffc0 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1ffd0 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1ffe0 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1fff0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
20000 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
20010 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
20020 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
20030 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
20040 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
20050 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
20060 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
20070 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
20080 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
20090 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
200a0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
200b0 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
200c0 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
200d0 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
200e0 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
200f0 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
20100 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
20110 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
20120 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
20130 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
20140 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
20150 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
20160 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
20170 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
20180 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
20190 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
201a0 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32 30   if( r>=92233720
201b0 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
201c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79  return -1;.    y
201d0 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69   = (i64)r;.    i
201e0 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20  f( i<y ) return 
201f0 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20  -1;.    if( i>y 
20200 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
20210 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
20220 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
20230 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
20240 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
20250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
20260 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
20270 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
20280 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
20290 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
202a0 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
202b0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
202c0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
202d0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
202e0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
202f0 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
20300 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
20310 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
20320 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
20330 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
20340 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
20350 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
20360 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
20370 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
20380 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
20390 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
203a0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
203b0 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
203c0 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
203d0 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
203e0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
203f0 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
20400 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
20410 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
20420 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
20430 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
20440 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
20450 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
20460 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
20470 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
20480 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
20490 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
204a0 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
204b0 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
204c0 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  2;.  assert( !sq
204d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f  lite3VdbeMemIsRo
204e0 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20 21  wSet(pMem1) && !
204f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
20500 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29 3b  RowSet(pMem2) );
20510 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
20520 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
20530 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
20540 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
20550 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
20560 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
20570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
20580 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
20590 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
205a0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
205b0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
205c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
205d0 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
205e0 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
205f0 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
20600 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
20610 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
20620 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29  l|MEM_IntReal) )
20630 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
20640 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
20650 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
20660 74 65 73 74 63 61 73 65 28 20 63 6f 6d 62 69 6e  testcase( combin
20670 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
20680 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
20690 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  ase( combined_fl
206a0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61  ags & MEM_IntRea
206b0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 31  l );.    if( (f1
206c0 20 26 20 66 32 20 26 20 28 4d 45 4d 5f 49 6e 74   & f2 & (MEM_Int
206d0 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d  |MEM_IntReal))!=
206e0 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
206f0 61 73 65 28 20 66 31 20 26 20 66 32 20 26 20 4d  ase( f1 & f2 & M
20700 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
20710 74 65 73 74 63 61 73 65 28 20 66 31 20 26 20 66  testcase( f1 & f
20720 32 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20  2 & MEM_IntReal 
20730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
20740 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
20750 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
20760 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
20770 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
20780 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
20790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
207a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
207b0 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
207c0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
207d0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
207e0 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
207f0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
20800 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
20810 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
20820 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
20830 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20840 20 20 69 66 28 20 28 66 31 26 28 4d 45 4d 5f 49    if( (f1&(MEM_I
20850 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29  nt|MEM_IntReal))
20860 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
20870 74 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f  tcase( f1 & MEM_
20880 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
20890 74 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f  tcase( f1 & MEM_
208a0 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  IntReal );.     
208b0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
208c0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
208d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
208e0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
208f0 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32  Mem1->u.i, pMem2
20900 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
20910 6c 73 65 20 69 66 28 20 28 66 32 26 28 4d 45 4d  lse if( (f2&(MEM
20920 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
20930 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
20940 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
20950 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  < pMem2->u.i ) r
20960 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
20970 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
20980 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
20990 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
209a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
209b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
209c0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
209d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
209e0 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
209f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
20a00 20 28 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45   (f2&(MEM_Int|ME
20a10 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29  M_IntReal))!=0 )
20a20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
20a30 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  se( f2 & MEM_Int
20a40 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
20a50 63 61 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49  case( f2 & MEM_I
20a60 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ntReal );.      
20a70 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65    return -sqlite
20a80 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
20a90 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem2->u.i, pMe
20aa0 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m1->u.r);.      
20ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20ac0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
20ad0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
20ae0 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn +1;.  }..  /*
20af0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
20b00 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68   a string and th
20b10 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f  e other is a blo
20b20 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  b, the string is
20b30 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
20b40 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c  oth are strings,
20b50 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74   compare using t
20b60 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  he collating fun
20b70 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
20b80 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
20b90 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
20ba0 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53   if( (f1 & MEM_S
20bb0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
20bc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20bd0 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45      if( (f2 & ME
20be0 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
20bf0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
20c00 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
20c10 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65   pMem1->enc==pMe
20c20 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31  m2->enc || pMem1
20c30 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
20c40 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ed );.    assert
20c50 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  ( pMem1->enc==SQ
20c60 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20  LITE_UTF8 || .  
20c70 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d            pMem1-
20c80 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
20c90 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65  16LE || pMem1->e
20ca0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
20cb0 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  BE );..    /* Th
20cc0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
20cd0 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66  ence must be def
20ce0 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ined at this poi
20cf0 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  nt, even if.    
20d00 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65  ** the user dele
20d10 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  tes the collatio
20d20 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
20d30 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
20d40 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  m is.    ** comp
20d50 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e  iled (this was n
20d60 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  ot always the ca
20d70 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  se)..    */.    
20d80 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c  assert( !pColl |
20d90 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  | pColl->xCmp );
20da0 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ..    if( pColl 
20db0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20dc0 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
20dd0 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  ring(pMem1, pMem
20de0 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  2, pColl, 0);.  
20df0 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20    }.    /* If a 
20e00 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73  NULL pointer was
20e10 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
20e20 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  ollate function,
20e30 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20   fall through.  
20e40 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62    ** to the blob
20e50 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65   case and use me
20e60 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a  mcmp().  */.  }.
20e70 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75   .  /* Both valu
20e80 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73  es must be blobs
20e90 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67  .  Compare using
20ea0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
20eb0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
20ec0 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  lobCompare(pMem1
20ed0 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a  , pMem2);.}.../*
20ee0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
20ef0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
20f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20f10 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20  s a serial-type 
20f20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  that.** correspo
20f30 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nds to an intege
20f40 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62  r - all values b
20f50 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69  etween 1 and 9 i
20f60 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63  nclusive .** exc
20f70 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e  ept 7. The secon
20f80 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
20f90 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
20fa0 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
20fb0 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61  .** serialized a
20fc0 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69  ccording to seri
20fd0 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75  al_type. This fu
20fe0 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
20ff0 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  zes.** and retur
21000 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f  ns the value..*/
21010 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65  .static i64 vdbe
21020 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
21030 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
21040 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29   const u8 *aKey)
21050 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73  {.  u32 y;.  ass
21060 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
21070 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e  || (serial_type>
21080 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =1 && serial_typ
21090 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=9 && serial_t
210a0 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69  ype!=7) );.  swi
210b0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
210c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a   ){.    case 0:.
210d0 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
210e0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
210f0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
21100 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54    return ONE_BYT
21110 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
21120 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74   case 2:.      t
21130 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
21140 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
21150 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49  eturn TWO_BYTE_I
21160 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
21170 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74  se 3:.      test
21180 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
21190 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
211a0 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  rn THREE_BYTE_IN
211b0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
211c0 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 4: {.      tes
211d0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
211e0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d  x80 );.      y =
211f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
21200 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  aKey);.      ret
21210 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  urn (i64)*(int*)
21220 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  &y;.    }.    ca
21230 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 5: {.      te
21240 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
21250 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
21260 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55  turn FOUR_BYTE_U
21270 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
21280 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
21290 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
212a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
212b0 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78  6: {.      u64 x
212c0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
212d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
212e0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
212f0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78  &0x80 );.      x
21300 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
21310 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
21320 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +4);.      retur
21330 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78  n (i64)*(i64*)&x
21340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
21350 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
21360 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe - 8);.}../*.*
21370 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21380 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
21390 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
213a0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
213b0 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
213c0 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
213d0 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
213e0 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
213f0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
21400 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
21410 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
21420 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
21430 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
21440 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
21450 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
21460 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
21470 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  reated by the OP
21480 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
21490 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
214a0 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
214b0 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
214c0 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
214d0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
214e0 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
214f0 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49  eRecord..**.** I
21500 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70  f argument bSkip
21510 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74   is non-zero, it
21520 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
21530 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
21540 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72  already.** deter
21550 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
21560 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
21570 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
21580 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  l..**.** Key1 an
21590 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
215a0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
215b0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
215c0 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20   fields. If all 
215d0 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20  .** fields that 
215e0 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b  appear in both k
215f0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  eys are equal, t
21600 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  hen pPKey2->defa
21610 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65  ult_rc is .** re
21620 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
21630 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
21640 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72  tion is discover
21650 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e  ed, set pPKey2->
21660 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53  errCode to .** S
21670 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e  QLITE_CORRUPT an
21680 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61  d return 0. If a
21690 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
216a0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20  ncountered, .** 
216b0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
216c0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
216d0 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69  _NOMEM and, if i
216e0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
216f0 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69  he.** malloc-fai
21700 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20  led flag set on 
21710 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
21720 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  (pPKey2->pKeyInf
21730 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73  o->db)..*/.int s
21740 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21750 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
21760 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
21770 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
21780 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
21790 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
217a0 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20  rd *pPKey2,     
217b0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
217c0 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20   */.  int bSkip 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
217f0 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74  , skip the first
21800 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75   field */.){.  u
21810 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21830 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
21840 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
21850 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  a element */.  i
21860 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21880 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
21890 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65  field to compare
218a0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
218b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
218d0 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69   record header i
218e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
218f0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21910 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
21920 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a  type in header *
21930 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  /.  int rc = 0; 
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
21960 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  lue */.  Mem *pR
21970 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  hs = pPKey2->aMe
21980 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  m;       /* Next
21990 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
219a0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
219b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
219c0 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
219d0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
219e0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
219f0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
21a00 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
21a10 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
21a20 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
21a30 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
21a40 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
21a50 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
21a60 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
21a70 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
21a80 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
21a90 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
21aa0 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
21ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
21ac0 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
21ad0 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
21ae0 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
21af0 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
21b00 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
21b10 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
21b20 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
21b30 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
21b40 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
21b50 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
21b60 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
21b70 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
21b80 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
21b90 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
21ba0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
21bb0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
21bc0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
21bd0 69 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  i = 0;.  }.  if(
21be0 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
21bf0 65 79 31 20 29 7b 20 0a 20 20 20 20 70 50 4b 65  ey1 ){ .    pPKe
21c00 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
21c10 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
21c20 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
21c30 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
21c40 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56  ion */.  }..  VV
21c50 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
21c60 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
21c70 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
21c80 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
21c90 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
21ca0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21cb0 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b  ->nAllField>=pPK
21cc0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
21cd0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
21ce0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
21cf0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
21d00 3e 61 53 6f 72 74 46 6c 61 67 73 21 3d 30 20 29  >aSortFlags!=0 )
21d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
21d20 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  y2->pKeyInfo->nK
21d30 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  eyField>0 );.  a
21d40 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
21d50 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
21d60 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
21d70 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
21d80 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
21d90 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
21da0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
21db0 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
21dc0 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  IntReal) ){.    
21dd0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 68 73    testcase( pRhs
21de0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
21df0 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
21e00 61 73 65 28 20 70 52 68 73 2d 3e 66 6c 61 67 73  ase( pRhs->flags
21e10 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
21e20 3b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  ;.      serial_t
21e30 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
21e40 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
21e50 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
21e60 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
21e70 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
21e80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21e90 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
21ea0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
21eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
21ec0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
21ed0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
21ee0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
21ef0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
21f00 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
21f10 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
21f20 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  mem1);.        r
21f30 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  c = -sqlite3IntF
21f40 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73  loatCompare(pRhs
21f50 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29  ->u.i, mem1.u.r)
21f60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21f70 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
21f80 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
21f90 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
21fa0 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
21fb0 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
21fc0 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
21fd0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
21fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21ff0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
22000 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
22010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22020 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
22030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22040 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
22050 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
22060 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
22070 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
22080 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
22090 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
220a0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
220b0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
220c0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
220d0 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20  s 12 or greater 
220e0 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20  are strings and 
220f0 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74  blobs (greater t
22100 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  han.        ** n
22110 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31  umbers). Types 1
22120 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72  0 and 11 are cur
22130 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64  rently "reserved
22140 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20   for future .   
22150 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f       ** use", so
22160 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c   it doesn't real
22170 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74  ly matter what t
22180 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f  he results of co
22190 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20  mparing.        
221a0 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65  ** them to numbe
221b0 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20  ric values are. 
221c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
221d0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
221e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
221f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
22200 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
22210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22220 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
22230 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
22240 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
22250 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
22260 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
22270 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
22280 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e  em1.u.r<pRhs->u.
22290 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
222a0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
222b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
222c0 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72  m1.u.r>pRhs->u.r
222d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
222e0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
222f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
22300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
22310 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f   = sqlite3IntFlo
22320 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75  atCompare(mem1.u
22330 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a  .i, pRhs->u.r);.
22340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22350 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
22360 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20  RHS is a string 
22370 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
22380 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
22390 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67  M_Str ){.      g
223a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
223b0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
223c0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
223d0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
223e0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
223f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
22400 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
22410 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
22420 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
22430 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
22440 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
22450 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22460 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28        mem1.n = (
22470 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
22480 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
22490 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
224a0 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  1.n)==(unsigned)
224b0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
224c0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
224d0 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67  em1.n+1)==(unsig
224e0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
224f0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d       if( (d1+mem
22500 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  1.n) > (unsigned
22510 29 6e 4b 65 79 31 0a 20 20 20 20 20 20 20 20 20  )nKey1.         
22520 7c 7c 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70  || (pKeyInfo = p
22530 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
22540 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20  ->nAllField<=i. 
22550 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22560 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
22570 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
22580 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22590 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
225a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
225b0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
225c0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
225d0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
225e0 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
225f0 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
22600 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
22610 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
22620 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
22630 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
22640 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
22650 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
22660 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
22670 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
22680 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
22690 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
226a0 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
226b0 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
226c0 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
226d0 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
226e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
226f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22700 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
22710 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
22720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
22730 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
22740 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
22750 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
22760 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
22770 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
22780 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
22790 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
227a0 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
227b0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
227c0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
227d0 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
227e0 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e   assert( (pRhs->
227f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
22800 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d  )==0 || pRhs->n=
22810 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56  =0 );.      getV
22820 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
22830 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
22840 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
22850 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
22860 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
22870 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
22880 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
22890 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
228a0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
228b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
228c0 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
228d0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
228e0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
228f0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
22900 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
22910 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
22920 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
22930 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
22940 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
22950 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
22960 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
22970 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
22980 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
22990 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
229a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
229b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
229c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
229d0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
229e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73    }else if( pRhs
229f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
22a00 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
22a10 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28  if( !isAllZero((
22a20 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65  const char*)&aKe
22a30 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a  y1[d1],nStr) ){.
22a40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22a50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
22a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22a70 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
22a80 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  s->u.nZero;.    
22a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22ab0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
22ac0 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
22ad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
22ae0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
22af0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
22b00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22b10 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
22b20 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
22b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22b40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
22b50 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
22b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
22b70 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
22b80 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
22b90 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
22ba0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
22bb0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
22bc0 20 20 69 6e 74 20 73 6f 72 74 46 6c 61 67 73 20    int sortFlags 
22bd0 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
22be0 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69  fo->aSortFlags[i
22bf0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72  ];.      if( sor
22c00 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  tFlags ){.      
22c10 20 20 69 66 28 20 28 73 6f 72 74 46 6c 61 67 73    if( (sortFlags
22c20 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52   & KEYINFO_ORDER
22c30 5f 42 49 47 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  _BIGNULL)==0.   
22c40 20 20 20 20 20 20 7c 7c 20 28 28 73 6f 72 74 46        || ((sortF
22c50 6c 61 67 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f  lags & KEYINFO_O
22c60 52 44 45 52 5f 44 45 53 43 29 0a 20 20 20 20 20  RDER_DESC).     
22c70 20 20 20 20 20 20 21 3d 28 73 65 72 69 61 6c 5f        !=(serial_
22c80 74 79 70 65 3d 3d 30 20 7c 7c 20 28 70 52 68 73  type==0 || (pRhs
22c90 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
22ca0 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ))).        ){. 
22cb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72           rc = -r
22cc0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
22cd0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
22ce0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
22cf0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
22d00 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22d10 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
22d20 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
22d30 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
22d40 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
22d50 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
22d60 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
22d70 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50  +;.    if( i==pP
22d80 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62  Key2->nField ) b
22d90 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b  reak;.    pRhs++
22da0 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
22db0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
22dc0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
22dd0 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
22de0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
22df0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
22e00 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
22e10 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
22e20 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
22e30 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
22e40 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22e50 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
22e60 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
22e70 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
22e80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
22e90 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
22ea0 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
22eb0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
22ec0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
22ed0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
22ee0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
22ef0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
22f00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
22f10 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
22f20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
22f30 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
22f40 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
22f50 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
22f60 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
22f70 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
22f80 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
22f90 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
22fa0 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
22fb0 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
22fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
22fd0 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
22fe0 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
22ff0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
23000 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
23010 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
23020 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
23030 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
23040 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23050 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
23060 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
23070 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
23080 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
23090 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
230a0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
230b0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
230c0 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
230d0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
230e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
230f0 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
23100 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
23110 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
23120 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23130 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
23140 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
23150 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
23160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23170 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
23180 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
23190 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
231a0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
231b0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
231c0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
231d0 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
231e0 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
231f0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
23200 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
23210 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
23220 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
23230 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
23240 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
23250 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
23260 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
23270 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
23280 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
23290 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
232a0 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
232b0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
232c0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
232d0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
232e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
232f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
23300 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
23310 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
23320 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
23330 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
23340 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
23350 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
23360 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
23370 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
23380 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
23390 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
233a0 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
233b0 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
233c0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
233d0 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
233e0 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
233f0 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
23400 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
23410 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
23420 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
23430 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
23440 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
23450 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
23460 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
23470 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
23480 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
23490 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
234a0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
234b0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
234c0 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
234d0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
234e0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
234f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
23500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
23510 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
23520 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
23530 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
23540 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
23550 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23560 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
23570 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23580 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
23590 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
235a0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
235b0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
235c0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
235d0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
235e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
235f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
23600 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
23610 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
23620 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
23630 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
23640 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
23650 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
23660 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
23670 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
23680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
23690 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
236a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
236b0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
236c0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
236d0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
236e0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
236f0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
23700 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
23710 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23720 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
23730 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
23740 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
23750 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
23760 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
23770 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
23780 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
23790 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
237a0 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
237b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
237c0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
237d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
237e0 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
237f0 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
23800 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
23810 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
23820 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
23830 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
23840 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
23850 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
23860 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
23870 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
23880 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
23890 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
238a0 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
238b0 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
238c0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
238d0 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
238e0 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
238f0 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
23900 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
23910 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
23920 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
23930 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
23940 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
23950 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
23960 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
23970 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
23980 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
23990 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
239a0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
239b0 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
239c0 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
239d0 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
239e0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
239f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23a00 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
23a10 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
23a20 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
23a30 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
23a40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
23a50 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
23a60 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
23a70 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
23a80 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
23a90 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
23aa0 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
23ab0 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
23ac0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
23ad0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
23ae0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
23af0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
23b00 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
23b10 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
23b20 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
23b30 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
23b40 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
23b50 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
23b60 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23b70 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
23b80 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
23b90 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
23ba0 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
23bb0 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
23bc0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
23bd0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
23be0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
23bf0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
23c00 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
23c10 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
23c20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
23c30 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
23c40 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
23c50 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
23c60 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
23c70 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
23c80 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
23c90 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
23ca0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
23cb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23cc0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
23cd0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
23ce0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23cf0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
23d00 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
23d10 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
23d20 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
23d30 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
23d40 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
23d50 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
23d60 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
23d70 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
23d80 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
23d90 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
23da0 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
23db0 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
23dc0 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
23dd0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
23de0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
23df0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
23e00 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
23e10 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
23e20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23e30 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
23e40 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
23e50 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
23e60 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
23e70 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
23e80 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
23e90 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
23ea0 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
23eb0 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
23ec0 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
23ed0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
23ee0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
23ef0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
23f00 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
23f10 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
23f20 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
23f30 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
23f40 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
23f50 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
23f60 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
23f70 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
23f80 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
23f90 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
23fa0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
23fb0 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
23fc0 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
23fd0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
23fe0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
23ff0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
24000 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
24010 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
24020 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
24030 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
24040 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
24050 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
24060 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
24070 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
24080 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
24090 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
240a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
240b0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
240c0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
240d0 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
240e0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
240f0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
24100 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
24110 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
24120 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
24130 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 29  .    if( res>0 )
24140 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
24150 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
24160 6c 73 65 20 69 66 28 20 72 65 73 3c 30 20 29 7b  lse if( res<0 ){
24170 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
24180 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 65 6c  ey2->r1;.    }el
24190 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
241a0 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
241b0 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
241c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
241d0 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
241e0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
241f0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
24200 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
24210 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
24220 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
24230 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
24240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24250 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
24260 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
24270 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
24280 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
24290 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
242a0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
242b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
242c0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
242d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
242e0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
242f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24300 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
24310 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
24320 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
24330 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20  pPKey2, res).   
24340 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
24350 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65  B.       || pPKe
24360 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
24370 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
24380 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
24390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
243a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
243b0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
243c0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
243d0 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
243e0 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
243f0 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
24400 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
24410 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
24420 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
24430 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
24440 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
24450 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
24460 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
24470 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
24480 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
24490 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
244a0 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
244b0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
244c0 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
244d0 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
244e0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
244f0 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
24500 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
24510 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
24520 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
24530 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
24540 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
24550 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
24560 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
24570 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
24580 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
24590 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
245a0 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
245b0 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
245c0 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
245d0 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
245e0 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
245f0 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
24600 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
24610 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
24620 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
24630 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
24640 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
24650 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
24660 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
24670 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
24680 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
24690 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
246a0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
246b0 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
246c0 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
246d0 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
246e0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
246f0 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
24700 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
24710 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
24720 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
24730 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
24740 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
24750 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
24760 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
24770 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
24780 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
24790 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
247a0 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
247b0 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  es.  */.  if( p-
247c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  >pKeyInfo->nAllF
247d0 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20  ield<=13 ){.    
247e0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61  int flags = p->a
247f0 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20  Mem[0].flags;.  
24800 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
24810 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 30 5d  o->aSortFlags[0]
24820 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
24830 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
24840 46 6c 61 67 73 5b 30 5d 20 26 20 4b 45 59 49 4e  Flags[0] & KEYIN
24850 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c  FO_ORDER_BIGNULL
24860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24870 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
24880 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 20 20 20  cordCompare;.   
24890 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72 31     }.      p->r1
248a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
248b0 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
248c0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
248d0 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
248e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
248f0 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
24900 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
24910 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
24920 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
24930 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
24940 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
24950 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24960 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
24970 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
24980 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
24990 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
249a0 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
249b0 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d  al|MEM_IntReal|M
249c0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
249d0 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 2d  ))==0.     && p-
249e0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
249f0 5b 30 5d 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  [0]==0.    ){.  
24a00 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
24a10 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
24a20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
24a30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
24a40 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
24a50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
24a60 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
24a70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
24a80 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
24a90 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
24aa0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
24ab0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
24ac0 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
24ad0 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
24ae0 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
24af0 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
24b00 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
24b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
24b20 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
24b30 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
24b40 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
24b50 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
24b60 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
24b70 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
24b80 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
24b90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
24ba0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
24bb0 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
24bc0 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
24bd0 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
24be0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
24bf0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
24c00 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
24c10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24c20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
24c30 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
24c40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
24c50 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
24c60 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
24c70 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
24c80 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
24c90 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
24ca0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
24cb0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
24cc0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
24cd0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
24ce0 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
24cf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
24d00 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
24d10 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
24d20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
24d30 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
24d40 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
24d50 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
24d60 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
24d70 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
24d80 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
24d90 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
24da0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
24db0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
24dc0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
24dd0 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
24de0 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
24df0 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
24e00 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
24e10 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
24e20 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
24e30 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
24e40 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
24e50 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
24e60 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
24e70 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
24e80 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
24e90 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
24ea0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
24eb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
24ec0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
24ed0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
24ee0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
24ef0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
24f00 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
24f10 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
24f20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24f30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24f40 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
24f50 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
24f60 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
24f70 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
24f80 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
24f90 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
24fa0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
24fb0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
24fc0 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
24fd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
24fe0 64 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b  dr>0x7fffffff );
24ff0 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d  .  assert( m.n>=
25000 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  0 );.  if( unlik
25010 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73  ely(szHdr<3 || s
25020 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d  zHdr>(unsigned)m
25030 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
25040 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
25050 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
25060 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
25070 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
25080 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
25090 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
250a0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
250b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
250c0 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
250d0 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
250e0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
250f0 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
25100 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
25110 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
25120 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
25130 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
25140 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
25150 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
25160 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
25170 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
25180 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
25190 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
251a0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
251b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
251c0 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
251d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
251e0 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
251f0 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
25200 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
25210 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
25220 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
25230 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
25240 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
25250 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
25260 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
25270 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
25280 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
25290 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
252a0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
252b0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
252c0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
252d0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
252e0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
252f0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
25300 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
25310 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
25320 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
25330 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
25340 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
25350 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
25360 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
25370 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
25380 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
25390 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
253a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
253b0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
253c0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
253d0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
253e0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
253f0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
25400 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
25410 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
25420 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
25430 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
25440 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
25450 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
25460 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
25470 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
25480 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
25490 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
254a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
254b0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
254c0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
254d0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
254e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
254f0 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
25500 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
25510 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
25520 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
25530 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
25540 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
25550 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
25560 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
25570 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
25580 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
25590 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
255a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
255b0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
255c0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
255d0 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
255e0 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
255f0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
25600 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
25610 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
25620 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
25630 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
25640 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
25650 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
25660 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
25670 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
25680 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
25690 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
256a0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
256b0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
256c0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
256d0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
256e0 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
256f0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25710 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
25720 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
25730 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
25740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25750 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
25760 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
25770 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
25780 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
25790 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
257a0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
257b0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
257e0 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
257f0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
25800 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
25810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
25820 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
25830 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
25840 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
25850 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
25860 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
25870 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
25880 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
25890 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
258a0 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
258b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
258c0 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
258d0 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
258e0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
258f0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
25900 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
25910 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
25920 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
25930 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
25940 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
25950 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
25960 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
25970 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
25980 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
25990 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
259a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
259b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
259c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
259d0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
259e0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
259f0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
25a00 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
25a10 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
25a20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25a40 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
25a50 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
25a60 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e  WithSkip(m.n, m.
25a70 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29  z, pUnpacked, 0)
25a80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
25a90 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
25aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25ab0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
25ac0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
25ad0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
25ae0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
25af0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
25b00 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
25b10 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
25b20 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
25b30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25b40 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
25b50 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
25b60 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
25b70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25b80 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
25b90 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
25ba0 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
25bb0 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
25bc0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
25bd0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
25be0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
25bf0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
25c00 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
25c10 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
25c20 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
25c30 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
25c40 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
25c50 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
25c60 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
25c70 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
25c80 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
25c90 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
25ca0 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
25cb0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
25cc0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
25cd0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
25ce0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
25cf0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
25d00 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
25d10 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
25d20 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
25d30 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
25d40 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
25d50 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
25d60 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
25d70 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
25d80 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
25d90 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
25da0 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
25db0 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
25dc0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
25dd0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
25de0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
25df0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
25e00 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
25e10 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73  *.** If iCode is
25e20 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74   1, then expirat
25e30 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e  ion is advisory.
25e40 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
25e50 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70  should.** be rep
25e60 72 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62  repared before b
25e70 65 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20  eing restarted, 
25e80 62 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72  but if it is alr
25e90 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20  eady running.** 
25ea0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  it is allowed to
25eb0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
25ec0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e  on..**.** Intern
25ed0 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
25ee0 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68  ion just sets th
25ef0 65 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66  e Vdbe.expired f
25f00 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72  lag on all.** pr
25f10 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
25f20 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  s.  The flag is 
25f30 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20  set to 1 for an 
25f40 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61  immediate expira
25f50 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20  tion.** and set 
25f60 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69  to 2 for an advi
25f70 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e  sory expiration.
25f80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25f90 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
25fa0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
25fb0 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29   *db, int iCode)
25fc0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
25fd0 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
25fe0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
25ff0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
26000 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a   = iCode+1;.  }.
26010 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
26020 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
26030 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
26040 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
26050 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
26060 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
26070 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
26080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
26090 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
260a0 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
260b0 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
260c0 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
260d0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
260e0 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
260f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
26100 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
26110 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
26120 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
26130 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
26140 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
26150 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
26160 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
26170 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
26180 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
26190 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
261a0 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
261b0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
261c0 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
261d0 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
261e0 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
261f0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
26200 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
26210 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
26220 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
26230 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
26240 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
26250 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
26260 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
26270 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
26280 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
26290 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
262a0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
262b0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
262c0 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
262d0 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
262e0 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
262f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
26300 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
26310 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
26320 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
26330 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
26340 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
26350 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
26360 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
26370 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
26380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26390 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
263a0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
263b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
263c0 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
263d0 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
263e0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
263f0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
26400 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
26410 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
26420 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
26430 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
26440 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
26450 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
26460 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
26470 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
26480 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
26490 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
264a0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
264b0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
264c0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
264d0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
264e0 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
264f0 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
26500 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
26510 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
26520 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26530 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
26540 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
26550 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
26560 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
26570 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
26580 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
26590 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
265a0 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  1));.  }.}../*.*
265b0 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69  * Cause a functi
265c0 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65  on to throw an e
265d0 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63  rror if it was c
265e0 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65  all from OP_Pure
265f0 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74  Func.** rather t
26600 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e  han OP_Function.
26610 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75  .**.** OP_PureFu
26620 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  nc means that th
26630 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  e function must 
26640 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  be deterministic
26650 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
26660 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
26670 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e  f it is given in
26680 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20  puts that would 
26690 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65  make it non-dete
266a0 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68  rministic..** Th
266b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
266c0 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69  voked by date/ti
266d0 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
266e0 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  t use non-determ
266f0 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75  inistic.** featu
26700 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77  res such as 'now
26710 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  '..*/.int sqlite
26720 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c  3NotPureFunc(sql
26730 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
26740 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  tx){.#ifdef SQLI
26750 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
26760 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62    if( pCtx->pVdb
26770 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
26780 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43  .#endif.  if( pC
26790 74 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70  tx->pVdbe->aOp[p
267a0 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65  Ctx->iOp].opcode
267b0 3d 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b  ==OP_PureFunc ){
267c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
267d0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
267e0 0a 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74  .       "non-det
267f0 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
26800 69 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70  ion in index exp
26810 72 65 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b  ression or CHECK
26820 20 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20   constraint",.  
26830 20 20 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65       -1);.    re
26840 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
26850 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 1;.}..#ifnd
26860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
26870 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
26880 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
26890 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
268a0 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
268b0 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
268c0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
268d0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
268e0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
268f0 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
26900 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
26910 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
26920 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
26930 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
26940 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26950 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
26960 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
26970 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
26980 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72    if( pVtab->zEr
26990 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  rMsg ){.    sqli
269a0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
269b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
269c0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
269d0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
269e0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
269f0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
26a00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
26a10 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
26a20 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
26a30 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
26a40 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
26a50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
26a60 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
26a70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26a80 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
26a90 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  HOOK../*.** If t
26aa0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
26ab0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
26ac0 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f  release any allo
26ad0 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
26ae0 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ed .** with the 
26af0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20  memory cells in 
26b00 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72  the p->aMem[] ar
26b10 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74  ray. Also free t
26b20 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  he UnpackedRecor
26b30 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  d.** structure i
26b40 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c  tself, using sql
26b50 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a  ite3DbFree()..**
26b60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26b70 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65  n is used to fre
26b80 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
26b90 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f   structures allo
26ba0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
26bb0 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64  vdbeUnpackRecord
26bc0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e  () function foun
26bd0 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a  d in vdbeapi.c..
26be0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
26bf0 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
26c00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
26c10 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65   nField, Unpacke
26c20 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
26c30 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
26c40 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
26c50 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  i<nField; i++){.
26c60 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
26c70 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  = &p->aMem[i];. 
26c80 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
26c90 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
26ca0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
26cb0 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
26cc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
26cd0 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  db, p);.  }.}.#e
26ce0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
26cf0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
26d00 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20  HOOK */..#ifdef 
26d10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
26d20 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
26d30 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
26d40 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
26d50 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
26d60 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
26d70 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
26d80 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
26d90 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26da0 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
26db0 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
26dc0 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
26dd0 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
26de0 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
26df0 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
26e00 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
26e10 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
26e20 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
26e30 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
26e40 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
26e50 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
26e60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
26e70 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
26e80 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
26eb0 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
26ec0 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
26ed0 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ef0 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
26f00 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
26f10 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
26f40 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
26f50 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
26f60 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f80 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
26f90 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
26fc0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
26fd0 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
26fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26ff0 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
27000 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
27030 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
27040 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
27050 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
27060 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
27070 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
27080 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
27090 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
270a0 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ame;.  static co
270b0 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f  nst u8 fakeSortO
270c0 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rder = 0;..  ass
270d0 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64  ert( db->pPreUpd
270e0 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ate==0 );.  mems
270f0 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30  et(&preupdate, 0
27100 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61  , sizeof(PreUpda
27110 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52  te));.  if( HasR
27120 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b  owid(pTab)==0 ){
27130 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65  .    iKey1 = iKe
27140 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75  y2 = 0;.    preu
27150 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69  pdate.pPk = sqli
27160 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
27170 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
27180 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  e{.    if( op==S
27190 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
271a0 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d        iKey2 = v-
271b0 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b  >aMem[iReg].u.i;
271c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
271d0 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b    iKey2 = iKey1;
271e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
271f0 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
27200 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
27210 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
27220 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
27230 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
27240 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
27250 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
27260 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
27270 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
27280 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
27290 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
272a0 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
272b0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
272c0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
272d0 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
272e0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
272f0 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
27300 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
27310 4b 65 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d  KeyField = pTab-
27320 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61  >nCol;.  preupda
27330 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74  te.keyinfo.aSort
27340 46 6c 61 67 73 20 3d 20 28 75 38 2a 29 26 66 61  Flags = (u8*)&fa
27350 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70  keSortOrder;.  p
27360 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d  reupdate.iKey1 =
27370 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64   iKey1;.  preupd
27380 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79  ate.iKey2 = iKey
27390 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  2;.  preupdate.p
273a0 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64  Tab = pTab;..  d
273b0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
273c0 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62  &preupdate;.  db
273d0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
273e0 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64  back(db->pPreUpd
273f0 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20  ateArg, db, op, 
27400 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31  zDb, zTbl, iKey1
27410 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e  , iKey2);.  db->
27420 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a  pPreUpdate = 0;.
27430 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27440 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52  db, preupdate.aR
27450 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72  ecord);.  vdbeFr
27460 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
27470 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
27480 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
27490 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
274a0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
274b0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
274c0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
274d0 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64  yField+1, preupd
274e0 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
274f0 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
27500 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69  te.aNew ){.    i
27510 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
27520 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c  0; i<pCsr->nFiel
27530 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
27540 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
27550 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e  ease(&preupdate.
27560 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aNew[i]);.    }.
27570 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
27580 65 4e 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74  eNN(db, preupdat
27590 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23  e.aNew);.  }.}.#
275a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
275b0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
275c0 5f 48 4f 4f 4b 20 2a 2f 0a                       _HOOK */.