/ Hex Artifact Content
Login

Artifact 9f2a251e610ec962dca093e8d9644a5243be606c5f78a4a16582bd9edef50e1f:


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 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 23 69 66 64 65   z, n);.}..#ifde
06f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0700: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
0710: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
0720: 74 20 74 6f 20 74 68 65 20 56 64 62 65 2d 3e 70  t to the Vdbe->p
0730: 44 62 6c 53 74 72 20 6c 69 73 74 2e 0a 2a 2f 0a  DblStr list..*/.
0740: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0750: 41 64 64 44 62 6c 71 75 6f 74 65 53 74 72 28 73  AddDblquoteStr(s
0760: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
0770: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
0780: 2a 7a 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *z){.  if( p ){.
0790: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
07a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
07b0: 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20      DblquoteStr 
07c0: 2a 70 53 74 72 20 3d 20 73 71 6c 69 74 65 33 44  *pStr = sqlite3D
07d0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
07e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
0800: 65 6f 66 28 2a 70 53 74 72 29 2b 6e 2b 31 2d 73  eof(*pStr)+n+1-s
0810: 69 7a 65 6f 66 28 70 53 74 72 2d 3e 7a 29 29 3b  izeof(pStr->z));
0820: 0a 20 20 20 20 69 66 28 20 70 53 74 72 20 29 7b  .    if( pStr ){
0830: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 4e 65  .      pStr->pNe
0840: 78 74 53 74 72 20 3d 20 70 2d 3e 70 44 62 6c 53  xtStr = p->pDblS
0850: 74 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 44 62  tr;.      p->pDb
0860: 6c 53 74 72 20 3d 20 70 53 74 72 3b 0a 20 20 20  lStr = pStr;.   
0870: 20 20 20 6d 65 6d 63 70 79 28 70 53 74 72 2d 3e     memcpy(pStr->
0880: 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  z, z, n+1);.    
0890: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
08a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
08b0: 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 2f  ABLE_NORMALIZE./
08c0: 2a 0a 2a 2a 20 7a 49 64 20 6f 66 20 6c 65 6e 67  *.** zId of leng
08d0: 74 68 20 6e 49 64 20 69 73 20 61 20 64 6f 75 62  th nId is a doub
08e0: 6c 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69  le-quoted identi
08f0: 66 69 65 72 2e 20 20 43 68 65 63 6b 20 74 6f 20  fier.  Check to 
0900: 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 69  see if.** that i
0910: 64 65 6e 74 69 66 69 65 72 20 69 73 20 72 65 61  dentifier is rea
0920: 6c 6c 79 20 75 73 65 64 20 61 73 20 61 20 73 74  lly used as a st
0930: 72 69 6e 67 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f  ring literal..*/
0940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0950: 55 73 65 73 44 6f 75 62 6c 65 51 75 6f 74 65 64  UsesDoubleQuoted
0960: 53 74 72 69 6e 67 28 0a 20 20 56 64 62 65 20 2a  String(.  Vdbe *
0970: 70 56 64 62 65 2c 20 20 20 20 20 20 20 20 20 20  pVdbe,          
0980: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
0990: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
09a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
09b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
09c0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 69 64  double-quoted id
09d0: 65 6e 74 69 66 69 65 72 2c 20 61 6c 72 65 61 64  entifier, alread
09e0: 79 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  y dequoted */.){
09f0: 0a 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a  .  DblquoteStr *
0a00: 70 53 74 72 3b 0a 20 20 61 73 73 65 72 74 28 20  pStr;.  assert( 
0a10: 7a 49 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  zId!=0 );.  if( 
0a20: 70 56 64 62 65 2d 3e 70 44 62 6c 53 74 72 3d 3d  pVdbe->pDblStr==
0a30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0a40: 66 6f 72 28 70 53 74 72 3d 70 56 64 62 65 2d 3e  for(pStr=pVdbe->
0a50: 70 44 62 6c 53 74 72 3b 20 70 53 74 72 3b 20 70  pDblStr; pStr; p
0a60: 53 74 72 3d 70 53 74 72 2d 3e 70 4e 65 78 74 53  Str=pStr->pNextS
0a70: 74 72 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  tr){.    if( str
0a80: 63 6d 70 28 7a 49 64 2c 20 70 53 74 72 2d 3e 7a  cmp(zId, pStr->z
0a90: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
0aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
0ab0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
0ac0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0ad0: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0ae0: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0af0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0b00: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0b10: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0b20: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0b30: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0b40: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0b50: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0b60: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
0b70: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
0b80: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
0b90: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
0ba0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
0bb0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0bc0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0bd0: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0be0: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0bf0: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0c00: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0c10: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0c20: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0c30: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23  ->zSql = zTmp;.#
0c40: 69 66 20 30 0a 20 20 7a 54 6d 70 20 3d 20 70 41  if 0.  zTmp = pA
0c50: 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 41  ->zNormSql;.  pA
0c60: 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 70 42 2d  ->zNormSql = pB-
0c70: 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a 20 20 70 42 2d  >zNormSql;.  pB-
0c80: 3e 7a 4e 6f 72 6d 53 71 6c 20 3d 20 7a 54 6d 70  >zNormSql = zTmp
0c90: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 2d 3e 65  ;.#endif.  pB->e
0ca0: 78 70 6d 61 73 6b 20 3d 20 70 41 2d 3e 65 78 70  xpmask = pA->exp
0cb0: 6d 61 73 6b 3b 0a 20 20 70 42 2d 3e 70 72 65 70  mask;.  pB->prep
0cc0: 46 6c 61 67 73 20 3d 20 70 41 2d 3e 70 72 65 70  Flags = pA->prep
0cd0: 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 63 70 79 28  Flags;.  memcpy(
0ce0: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 2c 20 70 41  pB->aCounter, pA
0cf0: 2d 3e 61 43 6f 75 6e 74 65 72 2c 20 73 69 7a 65  ->aCounter, size
0d00: 6f 66 28 70 42 2d 3e 61 43 6f 75 6e 74 65 72 29  of(pB->aCounter)
0d10: 29 3b 0a 20 20 70 42 2d 3e 61 43 6f 75 6e 74 65  );.  pB->aCounte
0d20: 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  r[SQLITE_STMTSTA
0d30: 54 55 53 5f 52 45 50 52 45 50 41 52 45 5d 2b 2b  TUS_REPREPARE]++
0d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
0d50: 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61  e the Vdbe.aOp a
0d60: 72 72 61 79 20 73 6f 20 74 68 61 74 20 69 74 20  rray so that it 
0d70: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 4f 70 20  is at least nOp 
0d80: 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65 72 20  elements larger 
0d90: 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20 63 75 72  .** than its cur
0da0: 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69  rent size. nOp i
0db0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
0dc0: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
0dd0: 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34  equal.** to 1024
0de0: 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a  /sizeof(Op)..**.
0df0: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0e00: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0e10: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0e20: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0e30: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0e40: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0e50: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0e60: 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72  Parse.nOpAlloc r
0e70: 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  emain .** unchan
0e80: 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20  ged (this is so 
0e90: 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73  that any opcodes
0ea0: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0eb0: 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f  ed can be .** co
0ec0: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0ed0: 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
0ee0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56  he rest of the V
0ef0: 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dbe)..*/.static 
0f00: 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28  int growOpArray(
0f10: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70  Vdbe *v, int nOp
0f20: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65  ){.  VdbeOp *pNe
0f30: 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  w;.  Parse *p = 
0f40: 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  v->pParse;..  /*
0f50: 20 54 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54   The SQLITE_TEST
0f60: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0f70: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0f80: 69 6f 6e 20 69 73 20 64 65 73 69 67 6e 65 64 20  ion is designed 
0f90: 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f  to force.  ** mo
0fa0: 72 65 20 66 72 65 71 75 65 6e 74 20 72 65 61 6c  re frequent real
0fb0: 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63 65 20 70  locs and hence p
0fc0: 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f  rovide more oppo
0fd0: 72 74 75 6e 69 74 69 65 73 20 66 6f 72 20 0a 20  rtunities for . 
0fe0: 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f   ** simulated OO
0ff0: 4d 20 66 61 75 6c 74 73 2e 20 20 53 51 4c 49 54  M faults.  SQLIT
1000: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
1010: 54 52 45 53 53 20 69 73 20 67 65 6e 65 72 61 6c  TRESS is general
1020: 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20 64 75 72  ly used.  ** dur
1030: 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  ing testing only
1040: 2e 20 20 57 69 74 68 20 53 51 4c 49 54 45 5f 54  .  With SQLITE_T
1050: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
1060: 53 53 20 67 72 6f 77 20 74 68 65 20 6f 70 20 61  SS grow the op a
1070: 72 72 61 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  rray.  ** by the
1080: 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74   minimum* amount
1090: 20 72 65 71 75 69 72 65 64 20 75 6e 74 69 6c 20   required until 
10a0: 74 68 65 20 73 69 7a 65 20 72 65 61 63 68 65 73  the size reaches
10b0: 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20   512.  Normal.  
10c0: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 28 77 69  ** operation (wi
10d0: 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 54 45 53  thout SQLITE_TES
10e0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
10f0: 29 20 69 73 20 74 6f 20 64 6f 75 62 6c 65 20 74  ) is to double t
1100: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
1110: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 20 61  size of the op a
1120: 72 72 61 79 20 6f 72 20 61 64 64 20 31 4b 42 20  rray or add 1KB 
1130: 6f 66 20 73 70 61 63 65 2c 20 77 68 69 63 68 65  of space, whiche
1140: 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20  ver is smaller. 
1150: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1160: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
1170: 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20  RESS.  int nNew 
1180: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d  = (p->nOpAlloc>=
1190: 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  512 ? p->nOpAllo
11a0: 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  c*2 : p->nOpAllo
11b0: 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  c+nOp);.#else.  
11c0: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
11d0: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
11e0: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
11f0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
1200: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1210: 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64  METER(nOp);.#end
1220: 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
1230: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1240: 20 61 20 56 44 42 45 20 64 6f 65 73 20 6e 6f 74   a VDBE does not
1250: 20 67 72 6f 77 20 74 6f 6f 20 6c 61 72 67 65 20   grow too large 
1260: 2a 2f 0a 20 20 69 66 28 20 6e 4e 65 77 20 3e 20  */.  if( nNew > 
1270: 70 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  p->db->aLimit[SQ
1280: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
1290: 4f 50 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  OP] ){.    sqlit
12a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 70 2d 3e 64 62  e3OomFault(p->db
12b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d  .  assert( nOp<=
12e0: 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29  (1024/sizeof(Op)
12f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1300: 4e 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  New>=(p->nOpAllo
1310: 63 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77  c+nOp) );.  pNew
1320: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1330: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
1340: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
1350: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
1360: 29 7b 0a 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c  ){.    p->szOpAl
1370: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
1380: 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c  allocSize(p->db,
1390: 20 70 4e 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e   pNew);.    p->n
13a0: 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f  OpAlloc = p->szO
13b0: 70 41 6c 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70  pAlloc/sizeof(Op
13c0: 29 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20  );.    v->aOp = 
13d0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
13e0: 72 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54  rn (pNew ? SQLIT
13f0: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  E_OK : SQLITE_NO
1400: 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69  MEM_BKPT);.}..#i
1410: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1420: 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  G./* This routin
1430: 65 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  e is just a conv
1440: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
1450: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
1460: 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69   that will.** fi
1470: 72 65 20 61 66 74 65 72 20 65 61 63 68 20 6f 70  re after each op
1480: 63 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65 64  code is inserted
1490: 20 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75   and displayed u
14a0: 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20  sing.** "PRAGMA 
14b0: 76 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d  vdbe_addoptrace=
14c0: 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on"..*/.static v
14d0: 6f 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62  oid test_addop_b
14e0: 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b  reakpoint(void){
14f0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20  .  static int n 
1500: 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65  = 0;.  n++;.}.#e
1510: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ndif../*.** Add 
1520: 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  a new instructio
1530: 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  n to the list of
1540: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75   instructions cu
1550: 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20  rrent in the.** 
1560: 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68  VDBE.  Return th
1570: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1580: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
1590: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
15a0: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20  rs:.**.**    p  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69               Poi
15c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45  nter to the VDBE
15d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20  .**.**    op    
15e0: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70            The op
15f0: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e  code for this in
1600: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20  struction.**.** 
1610: 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20     p1, p2, p3   
1620: 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a     Operands.**.*
1630: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
1640: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1650: 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  l() function to 
1660: 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61  fix an address a
1670: 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  nd.** the sqlite
1680: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20  3VdbeChangeP4() 
1690: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e  function to chan
16a0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
16b0: 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e  the P4.** operan
16c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  d..*/.static SQL
16d0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
16e0: 20 67 72 6f 77 4f 70 33 28 56 64 62 65 20 2a 70   growOp3(Vdbe *p
16f0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1700: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
1710: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
1720: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
1730: 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  <=p->nOp );.  if
1740: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1750: 20 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   1) ) return 1;.
1760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
1770: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d  rse->nOpAlloc>p-
1780: 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e  >nOp );.  return
1790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
17b0: 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  , p3);.}.int sql
17c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
17d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
17e0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
17f0: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1800: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1810: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
1820: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
1830: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1840: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
1850: 20 6f 70 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66   op>=0 && op<0xf
1860: 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  f );.  if( p->pP
1870: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
1880: 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  i ){.    return 
1890: 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70  growOp3(p, op, p
18a0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a  1, p2, p3);.  }.
18b0: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f    p->nOp++;.  pO
18c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
18d0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
18e0: 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70  (u8)op;.  pOp->p
18f0: 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31  5 = 0;.  pOp->p1
1900: 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32   = p1;.  pOp->p2
1910: 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33   = p2;.  pOp->p3
1920: 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34   = p3;.  pOp->p4
1930: 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  .p = 0;.  pOp->p
1940: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
1950: 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ED;.#ifdef SQLIT
1960: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
1970: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d  _COMMENTS.  pOp-
1980: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
1990: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
19a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
19b0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
19c0: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
19d0: 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  race ){.    sqli
19e0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
19f0: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
1a00: 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70  ;.    test_addop
1a10: 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20  _breakpoint();. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
1a30: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
1a40: 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b  pOp->cycles = 0;
1a50: 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b  .  pOp->cnt = 0;
1a60: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1a70: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
1a80: 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c  AGE.  pOp->iSrcL
1a90: 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ine = 0;.#endif.
1aa0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1ab0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1ac0: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1ad0: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1af0: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1b00: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1b10: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1b20: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1b30: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1b50: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
1b60: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1b70: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
1b80: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1b90: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
1ba0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1bb0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1bc0: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47   p2, 0);.}../* G
1bd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1be0: 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1bf0: 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  l jump to instru
1c00: 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69  ction iDest.*/.i
1c10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  nt sqlite3VdbeGo
1c20: 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  to(Vdbe *p, int 
1c30: 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75 72 6e  iDest){.  return
1c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c50: 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p3(p, OP_Goto, 0
1c60: 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a  , iDest, 0);.}..
1c70: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c80: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 73 74   to cause the st
1c90: 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62 65 20  ring zStr to be 
1ca0: 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72  loaded into.** r
1cb0: 65 67 69 73 74 65 72 20 69 44 65 73 74 0a 2a 2f  egister iDest.*/
1cc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1cd0: 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62 65 20  LoadString(Vdbe 
1ce0: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63  *p, int iDest, c
1cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29  onst char *zStr)
1d00: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1d10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
1d20: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d30: 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30  Dest, 0, zStr, 0
1d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1d50: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 69  rate code that i
1d60: 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69  nitializes multi
1d70: 70 6c 65 20 72 65 67 69 73 74 65 72 73 20 74 6f  ple registers to
1d80: 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74 65 67   string or integ
1d90: 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  er.** constants.
1da0: 20 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20    The registers 
1db0: 62 65 67 69 6e 20 77 69 74 68 20 69 44 65 73 74  begin with iDest
1dc0: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 63 6f   and increase co
1dd0: 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20  nsecutively..** 
1de0: 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69 73 20  One register is 
1df0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20  initialized for 
1e00: 65 61 63 68 20 63 68 61 72 61 63 67 74 65 72 20  each characgter 
1e10: 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f  in zTypes[].  Fo
1e20: 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20 63 68  r each.** "s" ch
1e30: 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79 70 65  aracter in zType
1e40: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1e50: 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 66  r is a string if
1e60: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
1e70: 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72  .** not NULL, or
1e80: 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20   OP_Null if the 
1e90: 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c 6c 20  value is a null 
1ea0: 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20 65 61  pointer.  For ea
1eb0: 63 68 20 22 69 22 20 63 68 61 72 61 63 74 65 72  ch "i" character
1ec0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  .** in zTypes[],
1ed0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1ee0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1ef0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  an integer..**.*
1f00: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 73  * If the input s
1f10: 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65  tring does not e
1f20: 6e 64 20 77 69 74 68 20 22 58 22 20 74 68 65 6e  nd with "X" then
1f30: 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77   an OP_ResultRow
1f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
1f50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  is generated for
1f60: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 73 65   the values inse
1f70: 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rted..*/.void sq
1f80: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
1f90: 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ad(Vdbe *p, int 
1fa0: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1fb0: 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b  r *zTypes, ...){
1fc0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1fd0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
1fe0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1ff0: 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28   zTypes);.  for(
2000: 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73  i=0; (c = zTypes
2010: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
2020: 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b     if( c=='s' ){
2030: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2040: 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  r *z = va_arg(ap
2050: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2070: 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20  eAddOp4(p, z==0 
2080: 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53  ? OP_Null : OP_S
2090: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
20a0: 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20  +i, 0, z, 0);.  
20b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
20c0: 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i' ){.      sqli
20d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c  te3VdbeAddOp2(p,
20e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f   OP_Integer, va_
20f0: 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20 69 44  arg(ap, int), iD
2100: 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  est+i);.    }els
2110: 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  e{.      goto sk
2120: 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b  ip_op_resultrow;
2130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
2150: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
2160: 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f  iDest, i);.skip_
2170: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20  op_resultrow:.  
2180: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
2190: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
21a0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
21b0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
21c0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
21d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
21e0: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2200: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
2210: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
2220: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2230: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2240: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2260: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
2270: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
2280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2290: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
22a0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
22b0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
22c0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
22d0: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
22e0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
22f0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
2300: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2310: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2320: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
2330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2340: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2350: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2360: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2370: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
2380: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
23a0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
23b0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
23c0: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
23d0: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
23e0: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2400: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2420: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
2430: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
2440: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2450: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2460: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2480: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2490: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
24a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
24b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
24c0: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
24d0: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
24f0: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
2500: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
2510: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
2520: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
2530: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
2540: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
2550: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2560: 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64  cRawNN(sqlite3Vd
2570: 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69  beDb(p), 8);.  i
2580: 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63  f( p4copy ) memc
2590: 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20  py(p4copy, zP4, 
25a0: 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  8);.  return sql
25b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
25c0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
25d0: 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65  , p4copy, p4type
25e0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
25f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2600: 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  N./*.** Return t
2610: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2620: 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c 41 49  e current EXPLAI
2630: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62 61 73  N QUERY PLAN bas
2640: 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e  eline..** 0 mean
2650: 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74  s "none"..*/.int
2660: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2670: 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73 65 20  ainParent(Parse 
2680: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
2690: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
26a0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
26b0: 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
26c0: 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65  ;.  pOp = sqlite
26d0: 33 56 64 62 65 47 65 74 4f 70 28 70 50 61 72 73  3VdbeGetOp(pPars
26e0: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
26f0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  ->addrExplain);.
2700: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32    return pOp->p2
2710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2720: 20 6e 65 77 20 4f 50 5f 45 78 70 6c 61 69 6e 20   new OP_Explain 
2730: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
2740: 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67 20   the bPush flag 
2750: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61  is true, then ma
2760: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  ke this opcode t
2770: 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a 2a  he parent for.**
2780: 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70 6c   subsequent Expl
2790: 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69 74  ains until sqlit
27a0: 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f 70  e3VdbeExplainPop
27b0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
27c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
27d0: 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20 2a  eExplain(Parse *
27e0: 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73 68  pParse, u8 bPush
27f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2800: 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 66 28 20  mt, ...){.  if( 
2810: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2820: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
2830: 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62 65 20 2a  zMsg;.    Vdbe *
2840: 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  v;.    va_list a
2850: 70 3b 0a 20 20 20 20 69 6e 74 20 69 54 68 69 73  p;.    int iThis
2860: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
2870: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 4d  p, zFmt);.    zM
2880: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
2890: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
28a0: 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20   zFmt, ap);.    
28b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
28c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
28d0: 65 3b 0a 20 20 20 20 69 54 68 69 73 20 3d 20 76  e;.    iThis = v
28e0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74  ->nOp;.    sqlit
28f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2900: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 54 68 69  OP_Explain, iThi
2910: 73 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  s, pParse->addrE
2920: 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20 20 20 20  xplain, 0,.     
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
2950: 43 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  C);.    if( bPus
2960: 68 29 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  h) pParse->addrE
2970: 78 70 6c 61 69 6e 20 3d 20 69 54 68 69 73 3b 0a  xplain = iThis;.
2980: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70    }.}../*.** Pop
2990: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
29a0: 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e  RY PLAN stack on
29b0: 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  e level..*/.void
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
29d0: 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a 70 50  ainPop(Parse *pP
29e0: 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
29f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73  >addrExplain = s
2a00: 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69  qlite3VdbeExplai
2a10: 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3b  nParent(pParse);
2a20: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2a30: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2a40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61   */../*.** Add a
2a50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
2a60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
2a70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
2a80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
2a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
2aa0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
2ab0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
2ac0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
2ad0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
2ae0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
2af0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
2b00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
2b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2b20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
2b50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
2b60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
2b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2b80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
2b90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
2ba0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
2bb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c  {.  int j;.  sql
2bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
2bd0: 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
2be0: 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68  , iDb, 0, 0, zWh
2bf0: 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ere, P4_DYNAMIC)
2c00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
2c10: 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20  ->db->nDb; j++) 
2c20: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
2c30: 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f  tree(p, j);.}../
2c40: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
2c50: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
2c60: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
2c70: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
2c80: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
2c90: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
2ca0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2cb0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
2cc0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
2cd0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2cf0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2d00: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
2d10: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
2d20: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d40: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
2d50: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
2d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
2d70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2d80: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
2d90: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
2da0: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
2db0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
2dc0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2dd0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
2de0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69 66 28  , p2, p3);.  if(
2df0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2e00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 56  iled==0 ){.    V
2e10: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
2e20: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
2e30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
2e40: 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70 2d  _INT32;.    pOp-
2e50: 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d 0a  >p4.i = p4;.  }.
2e60: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2e70: 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ../* Insert the 
2e80: 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74  end of a co-rout
2e90: 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ine.*/.void sqli
2ea0: 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
2eb0: 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ine(Vdbe *v, int
2ec0: 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71   regYield){.  sq
2ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ee0: 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
2ef0: 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a  ne, regYield);..
2f00: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74    /* Clear the t
2f10: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
2f20: 72 20 63 61 63 68 65 2c 20 74 68 65 72 65 62 79  r cache, thereby
2f30: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65   ensuring that e
2f40: 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74  ach.  ** co-rout
2f50: 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20  ine has its own 
2f60: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20  independent set 
2f70: 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20 62 65  of registers, be
2f80: 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65  cause co-routine
2f90: 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70  s.  ** might exp
2fa0: 65 63 74 20 74 68 65 69 72 20 72 65 67 69 73 74  ect their regist
2fb0: 65 72 73 20 74 6f 20 62 65 20 70 72 65 73 65 72  ers to be preser
2fc0: 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50  ved across an OP
2fd0: 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a  _Yield, and.  **
2fe0: 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73   that could caus
2ff0: 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77  e problems if tw
3000: 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75  o or more co-rou
3010: 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20  tines are using 
3020: 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65  the same.  ** te
3030: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3040: 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72  ..  */.  v->pPar
3050: 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
3060: 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e  ;.  v->pParse->n
3070: 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.
3080: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3090: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
30a0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
30b0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
30c0: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
30d0: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
30e0: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
30f0: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
3100: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
3110: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
3120: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
3130: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
3140: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
3150: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
3160: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
3170: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
3180: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
3190: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
31a0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
31b0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
31c0: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
31d0: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
31e0: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
31f0: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
3200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
3210: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
3220: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3230: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
3240: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
3250: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
3260: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
3270: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
3280: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
3290: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
32a0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
32b0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
32c0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
32d0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
32e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
32f0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
3300: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
3310: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
3320: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
3330: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
3340: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
3350: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
3360: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3370: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
3380: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
3390: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
33a0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
33b0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
33c0: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
33f0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
3400: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
3410: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
3420: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
3430: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
3440: 72 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a  return ADDR(i);.
3450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
3460: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
3470: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3480: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3490: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
34a0: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
34b0: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
34c0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
34d0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
34e0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
34f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
3500: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
3510: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
3520: 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  el(Vdbe *v, int 
3530: 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  x){.  Parse *p =
3540: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
3550: 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20  t j = ADDR(x);. 
3560: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
3570: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3580: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
3590: 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
35a0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b   assert( j>=0 );
35b0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
35c0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
35d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
35e0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
35f0: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3600: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 72  race ){.      pr
3610: 69 6e 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41  intf("RESOLVE LA
3620: 42 45 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  BEL %d to %d\n",
3630: 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 20   x, v->nOp);.   
3640: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
3650: 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c 5b  sert( p->aLabel[
3660: 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 4c  j]==(-1) ); /* L
3670: 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20 62  abels may only b
3680: 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65 20  e resolved once 
3690: 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  */.    p->aLabel
36a0: 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  [j] = v->nOp;.  
36b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
36c0: 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20  the VDBE as one 
36d0: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  that can only be
36e0: 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a   run one time..*
36f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3700: 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64  beRunOnlyOnce(Vd
3710: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3720: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a  OnlyOnce = 1;.}.
3730: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3740: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3750: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3760: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
3770: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3780: 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64 62  VdbeReusable(Vdb
3790: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f  e *p){.  p->runO
37a0: 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a  nlyOnce = 0;.}..
37b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
37c0: 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73  BUG /* sqlite3As
37d0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c  sertMayAbort() l
37e0: 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ogic */../*.** T
37f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
3800: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61  e and function a
3810: 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  re used to itera
3820: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  te through all o
3830: 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56  pcodes.** in a V
3840: 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  dbe main program
3850: 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65   and each of the
3860: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74   sub-programs (t
3870: 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20  riggers) it may 
3880: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63  .** invoke direc
3890: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
38a0: 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  y. It should be 
38b0: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
38c0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70  .**.**   Op *pOp
38d0: 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65  ;.**   VdbeOpIte
38e0: 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20  r sIter;.**.**  
38f0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
3900: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
3910: 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20  );.**   sIter.v 
3920: 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  = v;            
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3940: 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20  // v is of type 
3950: 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c  Vdbe* .**   whil
3960: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
3970: 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b  Next(&sIter)) ){
3980: 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f  .**     // Do so
3990: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70  mething with pOp
39a0: 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c  .**   }.**   sql
39b0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
39c0: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
39d0: 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ** .*/.typedef s
39e0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
39f0: 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72   VdbeOpIter;.str
3a00: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b  uct VdbeOpIter {
3a10: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a30: 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65   Vdbe to iterate
3a40: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63   through the opc
3a50: 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62  odes of */.  Sub
3a60: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b  Program **apSub;
3a70: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
3a80: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20   of subprograms 
3a90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20  */.  int nSub;  
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
3ac0: 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f  ries in apSub */
3ad0: 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20  .  int iAddr;   
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
3b00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3b10: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
3b20: 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  iSub;           
3b30: 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61         /* 0 = ma
3b40: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20  in program, 1 = 
3b50: 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61  first sub-progra
3b60: 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61  m etc. */.};.sta
3b70: 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65  tic Op *opIterNe
3b80: 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70  xt(VdbeOpIter *p
3b90: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
3ba0: 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20  ->v;.  Op *pRet 
3bb0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a  = 0;.  Op *aOp;.
3bc0: 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66    int nOp;..  if
3bd0: 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53  ( p->iSub<=p->nS
3be0: 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70  ub ){..    if( p
3bf0: 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20  ->iSub==0 ){.   
3c00: 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b     aOp = v->aOp;
3c10: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e  .      nOp = v->
3c20: 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nOp;.    }else{.
3c30: 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61        aOp = p->a
3c40: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
3c50: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3c60: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3c70: 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub-1]->nOp;.    
3c80: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
3c90: 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20  >iAddr<nOp );.. 
3ca0: 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70     pRet = &aOp[p
3cb0: 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d  ->iAddr];.    p-
3cc0: 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66  >iAddr++;.    if
3cd0: 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20  ( p->iAddr==nOp 
3ce0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62  ){.      p->iSub
3cf0: 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64  ++;.      p->iAd
3d00: 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  dr = 0;.    }.  
3d10: 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70  .    if( pRet->p
3d20: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
3d30: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e  GRAM ){.      in
3d40: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
3d50: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
3d60: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
3d70: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
3d80: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62  r(j=0; j<p->nSub
3d90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3da0: 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d  if( p->apSub[j]=
3db0: 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72  =pRet->p4.pProgr
3dc0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
3dd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
3de0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20  =p->nSub ){.    
3df0: 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73      p->apSub = s
3e00: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
3e10: 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e  rFree(v->db, p->
3e20: 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20  apSub, nByte);. 
3e30: 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61         if( !p->a
3e40: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
3e50: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
3e60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e70: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d       p->apSub[p-
3e80: 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d  >nSub++] = pRet-
3e90: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
3ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3eb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
3ec0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
3ed0: 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
3ee0: 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
3ef0: 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61  n the VM associa
3f00: 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20  ted with pParse 
3f10: 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20  may.** throw an 
3f20: 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20  ABORT exception 
3f30: 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61  (causing the sta
3f40: 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20  tement, but not 
3f50: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
3f60: 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c  on.** to be roll
3f70: 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63  ed back). This c
3f80: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
3f90: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   if the main pro
3fa0: 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73  gram or any.** s
3fb0: 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74  ub-programs cont
3fc0: 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20  ains any of the 
3fd0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
3fe0: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69     *  OP_Halt wi
3ff0: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
4000: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
4010: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
4020: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77   OP_HaltIfNull w
4030: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4040: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4050: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4060: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
4070: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
4080: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
4090: 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b  me.**   *  OP_Fk
40a0: 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d  Counter with P2=
40b0: 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  =0 (immediate fo
40c0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
40d0: 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50  aint).**   *  OP
40e0: 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54 52  _CreateBtree/BTR
40f0: 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50  EE_INTKEY and OP
4100: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a  _InitCoroutine .
4110: 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52 45  **      (for CRE
4120: 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c  ATE TABLE AS SEL
4130: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
4140: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
4150: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
4160: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
4170: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
4180: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
4190: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
41a0: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
41b0: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
41c0: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
41d0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
41e0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
41f0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
4200: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
4210: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
4220: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
4230: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
4240: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
4250: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
4260: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
4270: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
4280: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
4290: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
42a0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
42b0: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
42c0: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
42d0: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ort = 0;.  int h
42e0: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b  asFkCounter = 0;
42f0: 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65  .  int hasCreate
4300: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
4310: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4320: 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70  e = 0;.  Op *pOp
4330: 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  ;.  VdbeOpIter s
4340: 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Iter;.  memset(&
4350: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
4360: 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65  (sIter));.  sIte
4370: 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c  r.v = v;..  whil
4380: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
4390: 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30  Next(&sIter))!=0
43a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f   ){.    int opco
43b0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
43c0: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
43d0: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20  ==OP_Destroy || 
43e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
43f0: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
4400: 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c  _VRename .     |
4410: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
4420: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
4430: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
4440: 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70       && ((pOp->p
4450: 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  1&0xff)==SQLITE_
4460: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
4470: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
4480: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
4490: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
44a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44b0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
44c0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 26  OP_CreateBtree &
44d0: 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45  & pOp->p3==BTREE
44e0: 5f 49 4e 54 4b 45 59 20 29 20 68 61 73 43 72 65  _INTKEY ) hasCre
44f0: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
4500: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4510: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
4520: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4530: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
4540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
4550: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
4560: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
4570: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
4580: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
4590: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
45a0: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
45b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
45c0: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
45d0: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
45e0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
45f0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
4600: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
4610: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
4620: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
4630: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
4640: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
4650: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
4660: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
4670: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
4680: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
4690: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
46a0: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
46b0: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
46c0: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
46d0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
46e0: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
46f0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
4700: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
4710: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
4720: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
4730: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
4740: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
4750: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
4760: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
4770: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
4780: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
4790: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
47a0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
47b0: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
47c0: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
47d0: 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  on */..#ifdef SQ
47e0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
47f0: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
4800: 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20 69 6e  Write counter in
4810: 20 74 68 65 20 56 44 42 45 20 69 66 20 74 68 65   the VDBE if the
4820: 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 61   cursor is not a
4830: 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 63  n.** ephemeral c
4840: 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74 68 65  ursor, or if the
4850: 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65 6e 74   cursor argument
4860: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69   is NULL..*/.voi
4870: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63  d sqlite3VdbeInc
4880: 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 56 64  rWriteCounter(Vd
4890: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
48a0: 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20 70 43  r *pC){.  if( pC
48b0: 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65  ==0.   || (pC->e
48c0: 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
48d0: 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20 20 26  _SORTER.       &
48e0: 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  & pC->eCurType!=
48f0: 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 0a 20  CURTYPE_PSEUDO. 
4900: 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e 69 73        && !pC->is
4910: 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a  Ephemeral).  ){.
4920: 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b      p->nWrite++;
4930: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4950: 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20  UG./*.** Assert 
4960: 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74 20 74  if an Abort at t
4970: 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  his point in tim
4980: 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  e might result i
4990: 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64  n a corrupt.** d
49a0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
49b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
49c0: 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65  rtAbortable(Vdbe
49d0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
49e0: 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  p->nWrite==0 || 
49f0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
4a00: 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  al );.}.#endif..
4a10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4a20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
4a30: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
4a40: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
4a50: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
4a60: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
4a70: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
4a80: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
4a90: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
4aa0: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
4ab0: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
4ac0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
4ad0: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
4ae0: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
4af0: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
4b00: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
4b10: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
4b20: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
4b30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
4b40: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
4b50: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
4b60: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
4b70: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
4b80: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
4b90: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
4ba0: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
4bb0: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
4bc0: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
4bd0: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
4be0: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
4bf0: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
4c00: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
4c10: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
4c20: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
4c30: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
4c40: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
4c50: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
4c60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
4c70: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
4c80: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  g labels..**.** 
4c90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
4ca0: 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20  l only function 
4cb0: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
4cc0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
4cd0: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69  enerator.** scri
4ce0: 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f  pt numbers the o
4cf0: 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79  pcodes correctly
4d00: 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68  .  Changes to th
4d10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
4d20: 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  be.** coordinate
4d30: 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20 74  d with changes t
4d40: 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e  o mkopcodeh.tcl.
4d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4d60: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
4d70: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
4d80: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
4d90: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
4da0: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
4db0: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
4dc0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
4dd0: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
4de0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
4df0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
4e00: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
4e10: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f  Reader = 0;.  pO
4e20: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
4e30: 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31  Op-1];.  while(1
4e40: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  ){..    /* Only 
4e50: 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64  JUMP opcodes and
4e60: 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20   the short list 
4e70: 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64  of special opcod
4e80: 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63 68  es in the switch
4e90: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65  .    ** below ne
4ea0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
4eb0: 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f  red.  The mkopco
4ec0: 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f  deh.tcl generato
4ed0: 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a  r script groups.
4ee0: 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65      ** all these
4ef0: 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65   opcodes togethe
4f00: 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74  r near the front
4f10: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c   of the opcode l
4f20: 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a  ist.  Skip.    *
4f30: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61  * any opcode tha
4f40: 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
4f50: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69  processing by vi
4f60: 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63  rtual of the fac
4f70: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74  t that.    ** it
4f80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
4f90: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
4fa0: 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66  PCODE, as a perf
4fb0: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
4fc0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
4fd0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
4fe0: 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  <=SQLITE_MX_JUMP
4ff0: 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20  _OPCODE ){.     
5000: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
5010: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
5020: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
5030: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
5040: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73  g.      ** cases
5050: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
5060: 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  h! */.      swit
5070: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
5080: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5090: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
50a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
50b0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
50c0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
50d0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
50e0: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20  thru */.        
50f0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
5100: 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20  P_AutoCommit:.  
5110: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
5120: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
5130: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
5140: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
5150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5160: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5170: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
5180: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
5190: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
51a0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
51b0: 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73  uum:.        cas
51c0: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
51d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  : {.          p-
51e0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
51f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
5200: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
5210: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5230: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
5240: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
5250: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
5260: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
5270: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
5280: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
5290: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
52a0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
52b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
52c0: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76  de generator nev
52d0: 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20  er codes any of 
52e0: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73  these opcodes as
52f0: 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20   a jump.        
5300: 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e    ** to a label.
5310: 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79    They are alway
5320: 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d  s coded as a jum
5330: 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61  p backwards to a
5340: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b   .          ** k
5350: 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  nown address */.
5360: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5370: 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
5380: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
53a0: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
53b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
53c0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
53d0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
53e0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20  ious;.          
53f0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5400: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5410: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5420: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5430: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5440: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5450: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5460: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5470: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5480: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5490: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
54a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
54b0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
54c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
54d0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
54e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
54f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
5500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5510: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
5520: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
5530: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5540: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
5550: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
5560: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
5570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5580: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5590: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
55a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
55b0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
55c0: 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  ( (pOp - p->aOp)
55d0: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
55e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
55f0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
5600: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
5610: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
5620: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
5630: 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d   n>nMaxArgs ) nM
5640: 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20  axArgs = n;.    
5650: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5660: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 64  rough into the d
5670: 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20  efault case */. 
5680: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
5690: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
56a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
56b0: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
56c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
56d0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73   mkopcodeh.tcl s
56e0: 63 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72  cript has so arr
56f0: 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61  anged things tha
5700: 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20  t the only.     
5710: 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75         ** non-ju
5720: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
5730: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
5740: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
5750: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5760: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e         ** have n
5770: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
5780: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5790: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
57a0: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
57b0: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
57c0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
57d0: 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  MP)!=0 );.      
57e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
57f0: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
5800: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
5810: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5820: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
5830: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20  pOp->p2)];.     
5840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5860: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5870: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
5880: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
5890: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
58a0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
58b0: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75  .      ** non-ju
58c0: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
58d0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
58e0: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
58f0: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5900: 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67   ** have non-neg
5910: 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72  ative values for
5920: 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73   P2. */.      as
5930: 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70  sert( (sqlite3Op
5940: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70  codeProperty[pOp
5950: 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f  ->opcode]&OPFLG_
5960: 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d  JUMP)==0 || pOp-
5970: 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  >p2>=0);.    }. 
5980: 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61     if( pOp==p->a
5990: 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Op ) break;.    
59a0: 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c  pOp--;.  }.  sql
59b0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
59c0: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
59d0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
59e0: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
59f0: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
5a00: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
5a10: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
5a20: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
5a30: 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c  r!=0 || DbMaskAl
5a40: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
5a50: 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sk) );.}../*.** 
5a60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
5a70: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
5a80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
5a90: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
5aa0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
5ab0: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
5ac0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5ad0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5ae0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
5af0: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
5b00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
5b10: 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64  at least N opcod
5b20: 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69  e slots are avai
5b30: 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f  lable in p witho
5b40: 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20  ut.** having to 
5b50: 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20  malloc for more 
5b60: 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77 68  space (except wh
5b70: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e  en compiled usin
5b80: 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  g.** SQLITE_TEST
5b90: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
5ba0: 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  .  This interfac
5bb0: 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  e is used during
5bc0: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76   testing.** to v
5bd0: 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 61  erify that certa
5be0: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  in calls to sqli
5bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
5c00: 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20  () can never.** 
5c10: 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f  fail due to a OO
5c20: 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63  M fault and henc
5c30: 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
5c40: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  n value from.** 
5c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c60: 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61  List() will alwa
5c70: 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a  ys be non-NULL..
5c80: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
5c90: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
5ca0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5cb0: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
5cc0: 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  ESS).void sqlite
5cd0: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
5ce0: 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 65  locRequired(Vdbe
5cf0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
5d00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20  ssert( p->nOp + 
5d10: 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e  N <= p->pParse->
5d20: 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65  nOpAlloc );.}.#e
5d30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69  ndif../*.** Veri
5d40: 66 79 20 74 68 61 74 20 74 68 65 20 56 4d 20 70  fy that the VM p
5d50: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5d60: 79 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  y argument does 
5d70: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  not contain.** a
5d80: 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  n OP_ResultRow o
5d90: 70 63 6f 64 65 2e 20 46 61 69 6c 20 61 6e 20 61  pcode. Fail an a
5da0: 73 73 65 72 74 28 29 20 69 66 20 69 74 20 64 6f  ssert() if it do
5db0: 65 73 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  es. This is used
5dc0: 0a 2a 2a 20 62 79 20 63 6f 64 65 20 69 6e 20 70  .** by code in p
5dd0: 72 61 67 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72  ragma.c to ensur
5de0: 65 20 74 68 61 74 20 74 68 65 20 69 6d 70 6c 65  e that the imple
5df0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63 65 72  mentation of cer
5e00: 74 61 69 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20  tain.** pragmas 
5e10: 63 6f 6d 70 6f 72 74 73 20 77 69 74 68 20 74 68  comports with th
5e20: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
5e30: 64 20 69 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d  d in the mkpragm
5e40: 61 74 61 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69  atab.tcl.** scri
5e50: 70 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  pt..*/.#if defin
5e60: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
5e70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5e80: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
5e90: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
5ea0: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
5eb0: 6f 52 65 73 75 6c 74 52 6f 77 28 56 64 62 65 20  oResultRow(Vdbe 
5ec0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
5ed0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5ee0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  p; i++){.    ass
5ef0: 65 72 74 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  ert( p->aOp[i].o
5f00: 70 63 6f 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74  pcode!=OP_Result
5f10: 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Row );.  }.}.#en
5f20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
5f30: 61 74 65 20 63 6f 64 65 20 28 61 20 73 69 6e 67  ate code (a sing
5f40: 6c 65 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 20  le OP_Abortable 
5f50: 6f 70 63 6f 64 65 29 20 74 68 61 74 20 77 69 6c  opcode) that wil
5f60: 6c 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 61 74  l.** verify that
5f70: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
5f80: 6d 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  m can safely cal
5f90: 6c 20 41 62 6f 72 74 20 69 6e 20 74 68 65 20 63  l Abort in the c
5fa0: 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78  urrent.** contex
5fb0: 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  t..*/.#if define
5fc0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5fd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5fe0: 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
5ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 6e 45  Vdbe *p, int onE
6000: 72 72 6f 72 29 7b 0a 20 20 69 66 28 20 6f 6e 45  rror){.  if( onE
6010: 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
6020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6030: 70 30 28 70 2c 20 4f 50 5f 41 62 6f 72 74 61 62  p0(p, OP_Abortab
6040: 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  le);.}.#endif../
6050: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6060: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
6070: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
6080: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
6090: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
60a0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
60b0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
60c0: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
60d0: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
60e0: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
60f0: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
6100: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
6110: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
6120: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
6130: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
6140: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
6150: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
6160: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
6170: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6180: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6190: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
61a0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
61b0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
61c0: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
61d0: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
61e0: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
61f0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
6200: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
6210: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
6220: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
6230: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
6240: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
6250: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
6260: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
6270: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
6280: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
6290: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
62a0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
62b0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
62c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
62d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
62e0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
62f0: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
6300: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
6310: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
6320: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
6330: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
6340: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
6350: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
6360: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6370: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
6380: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
6390: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
63a0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
63b0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
63c0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
63d0: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
63e0: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
63f0: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
6400: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
6410: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
6420: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
6430: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
6440: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
6450: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
6460: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
6470: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
6480: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6490: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
64a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
64b0: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
64e0: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
64f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
6500: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6520: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
6530: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
6540: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
6550: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
6560: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
6570: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
6580: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
6590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
65a0: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
65b0: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
65c0: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
65d0: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
65e0: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
65f0: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
6600: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
6610: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
6620: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
6630: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
6640: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
6650: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
6660: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
6670: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
6680: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
6690: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
66a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
66b0: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
66c0: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
66d0: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
66e0: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
66f0: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
6700: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
6710: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
6720: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
6730: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
6740: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
6750: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
6760: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
6770: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
6780: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
6790: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
67a0: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
67b0: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
67c0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
67d0: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
67e0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
67f0: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
6800: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
6810: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
6820: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
6830: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
6840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
6850: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
6860: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
6870: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
6880: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
6890: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
68a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
68b0: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
68c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
68d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
68e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68f0: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
6900: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
6910: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
6920: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
6930: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
6940: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
6950: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6960: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
6970: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
6980: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
6990: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
69a0: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
69b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
69c0: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
69d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
69e0: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
69f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a10: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
6a20: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
6a30: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
6a60: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
6a70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
6a80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6aa0: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
6ab0: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
6ac0: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
6ad0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6ae0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
6af0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
6b00: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b20: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
6b30: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
6b40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6b50: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
6b60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6b70: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
6b80: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
6b90: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6ba0: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
6bb0: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
6bc0: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
6bd0: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
6be0: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
6bf0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
6c00: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
6c10: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
6c20: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
6c30: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
6c40: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
6c50: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
6c60: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
6c70: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
6c80: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
6c90: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
6ca0: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
6cb0: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
6cc0: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
6cd0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
6ce0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
6cf0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
6d00: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
6d10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6d20: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6d30: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
6d40: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
6d50: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
6d60: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
6d70: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
6d80: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6d90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
6da0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
6db0: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
6dc0: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
6dd0: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
6de0: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
6df0: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
6e00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6e10: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
6e20: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
6e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6e40: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
6e50: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
6e60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
6e70: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
6e80: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
6e90: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6ea0: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
6eb0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
6ec0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
6ed0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
6ee0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
6ef0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
6f00: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
6f10: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
6f20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
6f30: 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20  e *p, u16 p5){. 
6f40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6f50: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
6f60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6f70: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
6f80: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
6f90: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
6fa0: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
6fb0: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
6fc0: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
6fd0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
6fe0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
6ff0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
7000: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
7010: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7020: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
7030: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
7040: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
7050: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
7060: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
7070: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
7080: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
7090: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
70a0: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
70b0: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
70c0: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
70d0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
70e0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
70f0: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
7100: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
7110: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
7120: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
7130: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
7140: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
7150: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
7160: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
7170: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
7180: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7190: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
71a0: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
71b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
71c0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
71d0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
71e0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
71f0: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65  NE void freeP4Me
7200: 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d  m(sqlite3 *db, M
7210: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
7220: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
7230: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7240: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c  >zMalloc);.  sql
7250: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
7260: 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51   p);.}.static SQ
7270: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7280: 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78  id freeP4FuncCtx
7290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71  (sqlite3 *db, sq
72a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
72b0: 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72  ){.  freeEphemer
72c0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
72d0: 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74  ->pFunc);. sqlit
72e0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
72f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
7300: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
7310: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
7320: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
7330: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
7340: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
7350: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7360: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
7370: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
7380: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7390: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
73a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
73b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
73c0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
73d0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
73e0: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44  C:.    case P4_D
73f0: 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  YNBLOB:.    case
7400: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7420: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
7430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7440: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
7450: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NFO: {.      if(
7460: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7470: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
7480: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
7490: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
74a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
74b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
74c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
74d0: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
74e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
74f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28  ExprDelete(db, (
7500: 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20  Expr*)p4);.     
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7520: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
7530: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
7540: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7550: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
7560: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
7570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7580: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
7590: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
75a0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
75b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
75c0: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
75d0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
75e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
75f0: 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d 28 64       freeP4Mem(d
7600: 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20  b, (Mem*)p4);.  
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7630: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
7640: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7650: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
7660: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
7670: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
7680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7690: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
76a0: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
76b0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
76c0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
76d0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
76e0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
76f0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
7700: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
7710: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
7720: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
7730: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
7740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
7750: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
7760: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
7770: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
7780: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
7790: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
77a0: 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b  pOp=&aOp[nOp-1];
77b0: 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d   pOp>=aOp; pOp--
77c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
77d0: 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34 5f 46  ->p4type <= P4_F
77e0: 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72 65 65  REE_IF_LE ) free
77f0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
7800: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
7810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7820: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
7830: 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69  MENTS.      sqli
7840: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
7850: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
7860: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
7870: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7880: 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20  eNN(db, aOp);.  
7890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  }.}../*.** Link 
78a0: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
78b0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
78c0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
78d0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
78e0: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
78f0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
7900: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
7910: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
7920: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
7930: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
7940: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
7950: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
7960: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
7970: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
7980: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
7990: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
79a0: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
79b0: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
79c0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
79d0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
79e0: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
79f0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
7a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7a10: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
7a20: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
7a30: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
7a40: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7a50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
7a60: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
7a70: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
7a80: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70  <p->nOp );.  pOp
7a90: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
7aa0: 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62  ;.  freeP4(p->db
7ab0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
7ac0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
7ad0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
7ae0: 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34  TUSED;.  pOp->p4
7af0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f  .z = 0;.  pOp->o
7b00: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
7b10: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
7b20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
7b30: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
7b40: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
7b50: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
7b60: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
7b70: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
7b80: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
7b90: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
7ba0: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
7bb0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
7bc0: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
7bd0: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
7be0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20  if( p->nOp>0 && 
7bf0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7c00: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
7c10: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7c20: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
7c30: 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a  p(p, p->nOp-1);.
7c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7c50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
7c60: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
7c70: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
7c80: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
7c90: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
7ca0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
7cb0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
7cc0: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
7cd0: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
7ce0: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
7cf0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
7d00: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
7d10: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
7d20: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
7d30: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
7d40: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
7d50: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
7d60: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
7d70: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
7d80: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
7d90: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
7da0: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
7db0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
7dc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
7dd0: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
7de0: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
7df0: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
7e00: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
7e10: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
7e20: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
7e30: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
7e40: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
7e50: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
7e60: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
7e70: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
7e80: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
7e90: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
7ea0: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
7eb0: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
7ec0: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
7ed0: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
7ee0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
7ef0: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
7f00: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
7f10: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
7f20: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
7f30: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
7f40: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7f50: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
7f60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  truction..*/.sta
7f70: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
7f80: 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61  NOINLINE vdbeCha
7f90: 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62  ngeP4Full(.  Vdb
7fa0: 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c  e *p,.  Op *pOp,
7fb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7fc0: 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20  P4,.  int n.){. 
7fd0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
7fe0: 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70   ){.    freeP4(p
7ff0: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
8000: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
8010: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
8020: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   0;.    pOp->p4.
8030: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
8040: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n<0 ){.    sqli
8050: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8060: 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70  p, (int)(pOp - p
8070: 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b  ->aOp), zP4, n);
8080: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
8090: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
80a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
80b0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
80c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
80d0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
80e0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
80f0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
8100: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
8110: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8120: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
8130: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
8140: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
8150: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
8160: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
8170: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
8180: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
8190: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
81a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
81b0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d  assert( p->aOp!=
81c0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
81d0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
81e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
81f0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34  ){.    if( n!=P4
8200: 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64  _VTAB ) freeP4(d
8210: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
8220: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
8230: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
8240: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
8250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
8260: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
8270: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
8280: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
8290: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
82a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
82b0: 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d  if( n>=0 || pOp-
82c0: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76  >p4type ){.    v
82d0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
82e0: 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b  p, pOp, zP4, n);
82f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8300: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
8310: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
8320: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
8330: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
8340: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
8350: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
8360: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
8370: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
8380: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
8390: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
83a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
83b0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
83c0: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
83d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21    }else if( zP4!
83e0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
83f0: 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70  ( n<0 );.    pOp
8400: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
8410: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
8420: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
8430: 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e  har)n;.    if( n
8440: 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69  ==P4_VTAB ) sqli
8450: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
8460: 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d  ble*)zP4);.  }.}
8470: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
8480: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66  he P4 operand of
8490: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
84a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
84b0: 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20  tion .** to the 
84c0: 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79  value defined by
84d0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20   the arguments. 
84e0: 20 54 68 69 73 20 69 73 20 61 20 68 69 67 68 2d   This is a high-
84f0: 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e  speed.** version
8500: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 43   of sqlite3VdbeC
8510: 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a  hangeP4()..**.**
8520: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
8530: 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65  must not have be
8540: 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
8550: 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20  fined.  And the 
8560: 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e  new.** P4 must n
8570: 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20  ot be P4_INT32. 
8580: 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62 65   Use sqlite3Vdbe
8590: 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69  ChangeP4() in ei
85a0: 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65  ther of.** those
85b0: 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   cases..*/.void 
85c0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
85d0: 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69  dP4(Vdbe *p, voi
85e0: 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  d *pP4, int n){.
85f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
8600: 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49   assert( n!=P4_I
8610: 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54  NT32 && n!=P4_VT
8620: 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
8630: 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n<=0 );.  if( p-
8640: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8650: 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28  d ){.    freeP4(
8660: 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a  p->db, n, pP4);.
8670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8680: 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20  ert( pP4!=0 );. 
8690: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
86a0: 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d  p>0 );.    pOp =
86b0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
86c0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
86d0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
86e0: 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70  NOTUSED );.    p
86f0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a  Op->p4type = n;.
8700: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
8710: 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pP4;.  }.}../*.*
8720: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
8730: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
8740: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
8750: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
8760: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
8770: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
8780: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
8790: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
87a0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
87b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
87c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
87d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
87e0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  o;.  assert( v!=
87f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8800: 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79  Idx!=0 );.  pKey
8810: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
8820: 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
8830: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66  rse, pIdx);.  if
8840: 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c  ( pKeyInfo ) sql
8850: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8860: 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34  (v, pKeyInfo, P4
8870: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
8880: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8890: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
88a0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
88b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
88c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
88d0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
88e0: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
88f0: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
8900: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
8910: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
8920: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
8930: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
8940: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
8950: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
8960: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
8970: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
8980: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
8990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
89a0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
89b0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
89c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
89d0: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
89e0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
89f0: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
8a00: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
8a10: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
8a20: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
8a30: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
8a40: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
8a50: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
8a60: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
8a70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8a80: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
8a90: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8aa0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
8ab0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8ac0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
8ad0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
8ae0: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
8af0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
8b00: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
8b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8b20: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
8b30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
8b40: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
8b50: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
8b60: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
8b70: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
8b80: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
8b90: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8ba0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
8bb0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8bc0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
8bd0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
8be0: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
8bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8c00: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
8c10: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
8c20: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
8c30: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
8c40: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
8c50: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
8c60: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
8c70: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
8c80: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
8c90: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
8ca0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
8cb0: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
8cc0: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
8cd0: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
8ce0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8cf0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
8d00: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
8d10: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
8d20: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
8d30: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
8d40: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
8d50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
8d60: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
8d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8d80: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
8d90: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
8da0: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
8db0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
8dc0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
8dd0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
8de0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
8df0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8e00: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
8e10: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
8e20: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
8e30: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
8e40: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
8e50: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
8e60: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
8e70: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
8e80: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
8e90: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
8ea0: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
8eb0: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
8ec0: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
8ed0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
8ee0: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
8ef0: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
8f00: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
8f10: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
8f20: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
8f30: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
8f40: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
8f50: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
8f60: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
8f70: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
8f80: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
8f90: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
8fa0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
8fb0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
8fc0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
8fd0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
8fe0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
8ff0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
9000: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
9010: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
9020: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
9030: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
9040: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
9050: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
9060: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
9070: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
9080: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
9090: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
90a0: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
90b0: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
90c0: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
90d0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
90e0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
90f0: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
9100: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
9110: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
9120: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9130: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
9140: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
9150: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
9160: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
9170: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
9180: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
9190: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
91a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
91b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
91c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
91d0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
91e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
91f0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
9200: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
9210: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9220: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
9230: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
9240: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
9250: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
9260: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
9270: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
9280: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
9290: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
92a0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
92b0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
92c0: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
92d0: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
92e0: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
92f0: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
9300: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
9310: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
9320: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
9330: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
9340: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
9350: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
9360: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
9370: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
9380: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
9390: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
93a0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
93b0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
93c0: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
93d0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
93e0: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
93f0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
9400: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
9410: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
9420: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
9430: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
9440: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
9450: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
9460: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
9470: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
9480: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
9490: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
94a0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
94b0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
94c0: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
94d0: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
94e0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
94f0: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
9500: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
9510: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
9520: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
9530: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9540: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
9550: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
9560: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
9570: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
9580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
9590: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
95a0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
95b0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
95c0: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
95d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
95e0: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
95f0: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
9600: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
9610: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
9620: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
9630: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
9640: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
9650: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
9660: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
9670: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
9680: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
9690: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
96a0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
96b0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
96c0: 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30  ;.  char zAlt[50
96d0: 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  ];.  zOpName = s
96e0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
96f0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
9700: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
9710: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
9720: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
9730: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
9740: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
9750: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
9760: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
9770: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
9780: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66  Name + 1;.    if
9790: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
97a0: 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20  sis,"IF ",3)==0 
97b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
97c0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
97d0: 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20  OREP2 ){.       
97e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
97f0: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
9800: 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28  zAlt, "r[P2] = (
9810: 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b  %s)", zSynopsis+
9820: 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  3);.      }else{
9830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9840: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9850: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69  (zAlt), zAlt, "i
9860: 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a  f %s goto P2", z
9870: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
9880: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f     }.      zSyno
9890: 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20  psis = zAlt;.   
98a0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a   }.    for(ii=jj
98b0: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
98c0: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
98d0: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
98e0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
98f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
9900: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
9910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
9920: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
9930: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9940: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9950: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
9960: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9970: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
9980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9990: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
99a0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
99b0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
99c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
99d0: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
99e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99f0: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
9a00: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
9a10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
9a20: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
9a30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9a40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
9a50: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
9a60: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
9a70: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9a80: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
9a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
9aa0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
9ab0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9ac0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9ad0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
9ae0: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
9af0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
9b00: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
9b10: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
9b20: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22  nopsis+ii+1,"+1"
9b30: 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
9b40: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b          ii += 2;
9b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
9b60: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2++;.           
9b70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
9b80: 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20  f( v2>1 ){.     
9b90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9ba0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
9bb0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e  jj, zTemp+jj, ".
9bc0: 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a  .%d", v1+v2-1);.
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9be0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9bf0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
9c00: 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22  sis+ii+1, "..P3"
9c10: 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  , 4)==0 && pOp->
9c20: 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p3==0 ){.       
9c30: 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20       ii += 4;.  
9c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9c50: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b    }.        jj +
9c60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9c70: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
9c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9c90: 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20    zTemp[jj++] = 
9ca0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
9cb0: 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f  .    if( !seenCo
9cc0: 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20  m && jj<nTemp-5 
9cd0: 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  && pOp->zComment
9ce0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9cf0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9d00: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9d10: 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ; %s", pOp->zCom
9d20: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20  ment);.      jj 
9d30: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
9d40: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
9d50: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e    }.    if( jj<n
9d60: 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d  Temp ) zTemp[jj]
9d70: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
9d80: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9d90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
9da0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9db0: 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  Temp, "%s", pOp-
9dc0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
9dd0: 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  jj = sqlite3Strl
9de0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  en30(zTemp);.  }
9df0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b  else{.    zTemp[
9e00: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d  0] = 0;.    jj =
9e10: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9e20: 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   jj;.}.#endif /*
9e30: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9e40: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9e50: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9e60: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9e70: 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a  URSOR_HINTS)./*.
9e80: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65  ** Translate the
9e90: 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20   P4.pExpr value 
9ea0: 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72  for an OP_Cursor
9eb0: 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f  Hint opcode into
9ec0: 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61   text.** that ca
9ed0: 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 69  n be displayed i
9ee0: 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20  n the P4 column 
9ef0: 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  of EXPLAIN outpu
9f00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9f10: 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28  d displayP4Expr(
9f20: 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70  StrAccum *p, Exp
9f30: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e  r *pExpr){.  con
9f40: 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30  st char *zOp = 0
9f50: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
9f60: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
9f70: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
9f80: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
9f90: 70 70 65 6e 64 66 28 70 2c 20 22 25 51 22 2c 20  ppendf(p, "%Q", 
9fa0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
9fb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9fc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
9fd0: 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ER:.      sqlite
9fe0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
9ff0: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
a000: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
a010: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a020: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
a030: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a040: 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  f(p, "NULL");.  
a050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a060: 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
a070: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a080: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a090: 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e  "r[%d]", pExpr->
a0a0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
a0b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a0c0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
a0d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
a0e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
a0f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a100: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a110: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
a120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a130: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a140: 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74  f(p, "c%d", (int
a150: 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29  )pExpr->iColumn)
a160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a180: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
a190: 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20    zOp = "LT";   
a1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a1b0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a  se TK_LE:      z
a1c0: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20  Op = "LE";      
a1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a1e0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GT:      zOp 
a1f0: 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65  = "GT";      bre
a200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a210: 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GE:      zOp = "
a220: 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GE";      break;
a230: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
a240: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22        zOp = "NE"
a250: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a260: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
a270: 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20     zOp = "EQ";  
a280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a290: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
a2a0: 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  zOp = "IS";     
a2b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a2c0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70   TK_ISNOT:   zOp
a2d0: 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72   = "ISNOT";   br
a2e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a2f0: 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _AND:     zOp = 
a300: 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "AND";     break
a310: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
a320: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52  :      zOp = "OR
a330: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a340: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
a350: 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b      zOp = "ADD";
a360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a370: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
a380: 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20   zOp = "MUL";   
a390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a3a0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f  e TK_MINUS:   zO
a3b0: 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62  p = "SUB";     b
a3c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a3d0: 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d  K_REM:     zOp =
a3e0: 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61   "REM";     brea
a3f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
a400: 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42  ITAND:  zOp = "B
a410: 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ITAND";  break;.
a420: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
a430: 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f  R:   zOp = "BITO
a440: 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  R";   break;.   
a450: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
a460: 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20    zOp = "DIV";  
a470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a480: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a  se TK_LSHIFT:  z
a490: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20  Op = "LSHIFT";  
a4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a4b0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_RSHIFT:  zOp 
a4c0: 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65  = "RSHIFT";  bre
a4d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a4e0: 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22  CONCAT:  zOp = "
a4f0: 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b  CONCAT";  break;
a500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
a510: 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e  NUS:  zOp = "MIN
a520: 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  US";   break;.  
a530: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
a540: 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b     zOp = "PLUS";
a550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a560: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
a570: 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  zOp = "BITNOT"; 
a580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a590: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70   TK_NOT:     zOp
a5a0: 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72   = "NOT";     br
a5b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a5c0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20  _ISNULL:  zOp = 
a5d0: 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b  "ISNULL";  break
a5e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
a5f0: 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f  TNULL: zOp = "NO
a600: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
a610: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a620: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a630: 70 70 65 6e 64 66 28 70 2c 20 22 25 73 22 2c 20  ppendf(p, "%s", 
a640: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
a650: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
a660: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
a670: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a680: 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a  p, "%s(", zOp);.
a690: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
a6a0: 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  r(p, pExpr->pLef
a6b0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  t);.    if( pExp
a6c0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
a6d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a6e0: 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29  ppend(p, ",", 1)
a6f0: 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  ;.      displayP
a700: 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e  4Expr(p, pExpr->
a710: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
a720: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
a730: 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29  ppend(p, ")", 1)
a740: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
a750: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
a760: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
a770: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
a780: 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69  R_HINTS) */...#i
a790: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
a7a0: 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  4./*.** Compute 
a7b0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
a7c0: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
a7d0: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
a7e0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
a7f0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
a800: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
a810: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
a820: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
a830: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
a840: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
a850: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
a860: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
a870: 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61   StrAccum x;.  a
a880: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
a890: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72   );.  sqlite3Str
a8a0: 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c  AccumInit(&x, 0,
a8b0: 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30   zTemp, nTemp, 0
a8c0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
a8d0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
a8e0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
a8f0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a   {.      int j;.
a900: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
a910: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
a920: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
a930: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
a940: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
a950: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
a960: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
a970: 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49  x, "k(%d", pKeyI
a980: 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b  nfo->nKeyField);
a990: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a9a0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  j<pKeyInfo->nKey
a9b0: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
a9c0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
a9d0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
a9e0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
a9f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aa00: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
aa10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b  oll->zName : "";
aa20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
aa30: 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41  cmp(zColl, "BINA
aa40: 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  RY")==0 ) zColl 
aa50: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73  = "B";.        s
aa60: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
aa70: 64 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20  df(&x, ",%s%s", 
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
aaa0: 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20  rder[j] ? "-" : 
aab0: 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  "", zColl);.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
aad0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c  3_str_append(&x,
aae0: 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ")", 1);.      
aaf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ab00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ab10: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
ab20: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
ab30: 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79   {.      display
ab40: 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e  P4Expr(&x, pOp->
ab50: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
ab60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ab70: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
ab80: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
ab90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
aba0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
abb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
abc0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
abd0: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
abe0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
abf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ac00: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
ac10: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
ac20: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
ac30: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
ac40: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ac50: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
ac60: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
ac70: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
ac80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
ac90: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
aca0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
acb0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
acc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
acd0: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
ace0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
acf0: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
ad00: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
ad10: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
ad20: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
ad30: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
ad40: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
ad50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ad60: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
ad70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ad80: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
ad90: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
ada0: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
adb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
adc0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
add0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ade0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
adf0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
ae00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ae10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
ae20: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
ae30: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ae40: 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  df(&x, "%.16g", 
ae50: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
ae60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
ae80: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
ae90: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
aea0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
aeb0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
aec0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
aed0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
aee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
aef0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
af00: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
af10: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
af20: 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22  pendf(&x, "%lld"
af30: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
af40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
af50: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
af60: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
af70: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
af80: 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ndf(&x, "%.16g",
af90: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
afa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
afb0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
afc0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ull ){.        z
afd0: 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20  P4 = "NULL";.   
afe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aff0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
b000: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
b010: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
b020: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
b030: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b040: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
b060: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
b070: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
b080: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
b090: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
b0a0: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
b0b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b0c0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 76 74 61  appendf(&x, "vta
b0d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20  b:%p", pVtab);. 
b0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
b100: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
b110: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
b120: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f      int *ai = pO
b130: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20  p->p4.ai;.      
b140: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20  int n = ai[0];  
b150: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
b160: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41  ement of an INTA
b170: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74  RRAY is always t
b180: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
b190: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75            ** cou
b1a0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
b1b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20   of elements to 
b1c0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  follow */.      
b1d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
b1e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b1f0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b200: 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69  (&x, ",%d", ai[i
b210: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b220: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27    zTemp[0] = '['
b230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b240: 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22  str_append(&x, "
b250: 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  ]", 1);.      br
b260: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b270: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
b280: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
b290: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b2a0: 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  x, "program");. 
b2b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59  }.    case P4_DY
b2d0: 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  NBLOB:.    case 
b2e0: 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20  P4_ADVANCE: {.  
b2f0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
b300: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b310: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b320: 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  _TABLE: {.      
b330: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b340: 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f  ndf(&x, "%s", pO
b350: 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d  p->p4.pTab->zNam
b360: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
b370: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b380: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
b390: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
b3a0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
b3b0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
b3c0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
b3d0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
b3e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b3f0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
b400: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
b410: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
b420: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
b430: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
b440: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
b450: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
b460: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
b470: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
b480: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
b490: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
b4a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b4b0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
b4c0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
b4d0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
b4e0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b4f0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
b500: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
b510: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
b520: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
b530: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
b540: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
b550: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
b560: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
b570: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
b580: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
b590: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
b5a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b5b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
b5c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
b5d0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
b5e0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
b5f0: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
b600: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
b610: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
b620: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
b630: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
b640: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
b650: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
b660: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
b670: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
b680: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
b690: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
b6a0: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
b6b0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
b6c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b6d0: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
b6e0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
b6f0: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
b700: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
b710: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
b720: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
b730: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
b740: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
b750: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
b760: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
b770: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
b780: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
b790: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
b7a0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
b7b0: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
b7c0: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
b7d0: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
b7e0: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
b7f0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
b800: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
b810: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
b820: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
b830: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
b840: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
b850: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
b860: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
b870: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
b880: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
b890: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
b8a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b8b0: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
b8c0: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
b8d0: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
b8e0: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
b8f0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
b900: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
b910: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
b920: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
b930: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
b940: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
b950: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
b960: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
b970: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
b980: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
b990: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
b9a0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
b9b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
b9c0: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
b9d0: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
b9e0: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
b9f0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
ba00: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
ba10: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
ba20: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
ba30: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
ba40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ba50: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
ba60: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
ba70: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
ba80: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
ba90: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
baa0: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
bab0: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
bac0: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
bad0: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
bae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
baf0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
bb00: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
bb10: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
bb20: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
bb30: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
bb40: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
bb50: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
bb60: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
bb70: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
bb80: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
bb90: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
bba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
bbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bbc0: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
bbd0: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
bbe0: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
bbf0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
bc00: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bc10: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
bc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
bc30: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
bc40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bc50: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
bc60: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
bc70: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
bc80: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
bc90: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
bca0: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
bcb0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
bcc0: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
bcd0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
bce0: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
bcf0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
bd00: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
bd10: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
bd20: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
bd30: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
bd40: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
bd50: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
bd60: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
bd70: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
bd80: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
bd90: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
bda0: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
bdb0: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
bdc0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
bdd0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
bde0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
bdf0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
be00: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
be10: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
be20: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
be30: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
be40: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
be50: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
be60: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
be70: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
be80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
be90: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
bea0: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
beb0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
bec0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
bed0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
bee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
bef0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
bf00: 75 74 2c 20 69 6e 74 20 70 63 2c 20 56 64 62 65  ut, int pc, Vdbe
bf10: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
bf20: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
bf30: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
bf40: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
bf50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
bf60: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
bf70: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
bf80: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
bf90: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
bfa0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
bfb0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
bfc0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
bfd0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
bfe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bff0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
c000: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
c010: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
c020: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
c030: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
c040: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
c050: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
c060: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
c070: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
c080: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
c090: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
c0a0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
c0b0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
c0c0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
c0d0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
c0e0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
c0f0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
c100: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
c110: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
c120: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
c130: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
c140: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
c150: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
c160: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
c170: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
c180: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
c190: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
c1a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
c1b0: 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61  itialize an arra
c1c0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
c1d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
c1e0: 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  id initMemArray(
c1f0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73  Mem *p, int N, s
c200: 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20  qlite3 *db, u16 
c210: 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28  flags){.  while(
c220: 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20   (N--)>0 ){.    
c230: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
c240: 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  p->flags = flags
c250: 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  ;.    p->szMallo
c260: 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
c270: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
c280: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30  ->pScopyFrom = 0
c290: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b  ;.#endif.    p++
c2a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
c2b0: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
c2c0: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
c2d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
c2e0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c2f0: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
c300: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
c310: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
c320: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
c330: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
c340: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
c350: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
c360: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
c370: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
c380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c390: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
c3a0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
c3b0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
c3c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c3d0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
c3e0: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
c3f0: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
c400: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
c410: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c420: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
c430: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
c440: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
c450: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
c460: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
c470: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
c480: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
c490: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
c4a0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
c4b0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
c4c0: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
c4d0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
c4e0: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
c4f0: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
c500: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
c510: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
c520: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
c530: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
c540: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
c550: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
c560: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
c570: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
c580: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
c590: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
c5a0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
c5b0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
c5c0: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
c5d0: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
c5e0: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
c5f0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
c600: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
c610: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
c620: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
c630: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
c640: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
c650: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
c660: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
c670: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
c680: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
c690: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
c6a0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
c6b0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
c6c0: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
c6d0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
c6e0: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
c6f0: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
c700: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
c710: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
c720: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
c730: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
c740: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c750: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
c760: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c770: 28 20 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74  ( p->xDel==sqlit
c780: 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65  e3VdbeFrameMemDe
c790: 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
c7a0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
c7b0: 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20  |MEM_Dyn) ){.   
c7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c7d0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
c7e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c7f0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
c800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c810: 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61  reeNN(db, p->zMa
c820: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
c830: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
c840: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
c850: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e  ->flags = MEM_Un
c860: 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68  defined;.    }wh
c870: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
c880: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  );.  }.}..#ifdef
c890: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
c8a0: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
c8b0: 70 46 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69  pFrame is a vali
c8c0: 64 20 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e  d VdbeFrame poin
c8d0: 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ter.  Return tru
c8e0: 65 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e  e if it is.** an
c8f0: 64 20 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74  d false if somet
c900: 68 69 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a  hing is wrong..*
c910: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c920: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f  e is intended fo
c930: 72 20 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20  r use inside of 
c940: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c950: 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  nts only..*/.int
c960: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c970: 65 49 73 56 61 6c 69 64 28 56 64 62 65 46 72 61  eIsValid(VdbeFra
c980: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69  me *pFrame){.  i
c990: 66 28 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d  f( pFrame->iFram
c9a0: 65 4d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46  eMagic!=SQLITE_F
c9b0: 52 41 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74  RAME_MAGIC ) ret
c9c0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
c9d0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  1;.}.#endif.../*
c9e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65  .** This is a de
c9f0: 73 74 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65  structor on a Me
ca00: 6d 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20  m object (which 
ca10: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c  is really an sql
ca20: 69 74 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74  ite3_value).** t
ca30: 68 61 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  hat deletes the 
ca40: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61  Frame object tha
ca50: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
ca60: 20 69 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a   it as a blob..*
ca70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ca80: 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74  e does not delet
ca90: 65 20 74 68 65 20 46 72 61 6d 65 20 72 69 67 68  e the Frame righ
caa0: 74 20 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65  t away.  It mere
cab0: 6c 79 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66  ly adds the.** f
cac0: 72 61 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f  rame to a list o
cad0: 66 20 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64  f frames to be d
cae0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
caf0: 56 64 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76  Vdbe halts..*/.v
cb00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
cb10: 72 61 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20  rameMemDel(void 
cb20: 2a 70 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72  *pArg){.  VdbeFr
cb30: 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56  ame *pFrame = (V
cb40: 64 62 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a  dbeFrame*)pArg;.
cb50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cb60: 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69  3VdbeFrameIsVali
cb70: 64 28 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70  d(pFrame) );.  p
cb80: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d  Frame->pParent =
cb90: 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c   pFrame->v->pDel
cba0: 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d  Frame;.  pFrame-
cbb0: 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20  >v->pDelFrame = 
cbc0: 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pFrame;.}.../*.*
cbd0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
cbe0: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
cbf0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
cc00: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
cc10: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
cc20: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
cc30: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
cc40: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
cc50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
cc60: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
cc70: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
cc80: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
cc90: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
cca0: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
ccb0: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
ccc0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
ccd0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
cce0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ccf0: 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c  e3VdbeFrameIsVal
cd00: 69 64 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69  id(p) );.  for(i
cd10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
cd20: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
cd30: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
cd40: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
cd50: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
cd60: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
cd70: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
cd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
cd90: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d  eteAuxData(p->v-
cda0: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
cdb0: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c  a, -1, 0);.  sql
cdc0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
cdd0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
cde0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cdf0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
ce00: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
ce10: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
ce20: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
ce30: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
ce40: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
ce50: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
ce60: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
ce70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
ce80: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
ce90: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
cea0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
ceb0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
cec0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
ced0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
cee0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
cef0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
cf00: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
cf10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
cf20: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
cf30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
cf40: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
cf50: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
cf60: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
cf70: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
cf80: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
cf90: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
cfa0: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
cfb0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
cfc0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
cfd0: 0a 2a 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20  .** 2018-04-24: 
cfe0: 20 49 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   In p->explain==
cff0: 32 20 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49  2 mode, the OP_I
d000: 6e 69 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74  nit opcodes of t
d010: 72 69 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61  riggers.** are a
d020: 6c 73 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68  lso shown, so th
d030: 61 74 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65  at the boundarie
d040: 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61  s between the ma
d050: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a  in program and.*
d060: 2a 20 65 61 63 68 20 74 72 69 67 67 65 72 20 61  * each trigger a
d070: 72 65 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20  re clear..**.** 
d080: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
d090: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
d0a0: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
d0b0: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
d0c0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
d0d0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
d0e0: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
d0f0: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
d100: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
d110: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d130: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
d140: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
d170: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
d180: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
d190: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
d1c0: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
d1d0: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
d1e0: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d200: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
d210: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
d220: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d240: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
d250: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
d260: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
d270: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d290: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
d2a0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d2b0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d2e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
d2f0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d310: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d320: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
d330: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
d340: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
d350: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
d360: 2a 2f 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75  */.  int bListSu
d370: 62 70 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70  bprogs = (p->exp
d380: 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e  lain==1 || (db->
d390: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54  flags & SQLITE_T
d3a0: 72 69 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a  riggerEQP)!=0);.
d3b0: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a    Op *pOp = 0;..
d3c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
d3d0: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
d3e0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
d3f0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
d400: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
d410: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
d420: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
d430: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
d440: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
d450: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
d460: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
d470: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
d480: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
d490: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
d4a0: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
d4b0: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
d4c0: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
d4d0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
d4e0: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
d4f0: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
d500: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
d510: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
d520: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
d530: 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75  , 8);.  p->pResu
d540: 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ltSet = 0;..  if
d550: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d560: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
d570: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
d580: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
d590: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
d5a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
d5b0: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
d5c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
d5d0: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
d5e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
d5f0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
d600: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
d610: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
d620: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
d630: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
d640: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
d650: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
d660: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
d670: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
d680: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
d690: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
d6a0: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
d6b0: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
d6c0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
d6d0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
d6e0: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
d6f0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
d700: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
d710: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
d720: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
d730: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
d740: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
d750: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
d760: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
d770: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
d780: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
d790: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
d7a0: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
d7b0: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
d7c0: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
d7d0: 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73  f( bListSubprogs
d7e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
d7f0: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
d800: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
d810: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
d820: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
d830: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
d840: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
d850: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
d860: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
d870: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
d880: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
d890: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
d8a0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
d8b0: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
d8c0: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
d8d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
d8e0: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
d8f0: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
d900: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
d910: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
d920: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
d930: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
d940: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
d950: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
d960: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
d970: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
d980: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
d990: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
d9a0: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
d9b0: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
d9c0: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
d9d0: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
d9e0: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
d9f0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
da00: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
da10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
da20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
da30: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
da40: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
da50: 0a 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a  .  while(1){  /*
da60: 20 4c 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20   Loop exits via 
da70: 62 72 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d  break */.    i =
da80: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66   p->pc++;.    if
da90: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
daa0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
dab0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
dac0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
dad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dae0: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
daf0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
db00: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
db10: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
db20: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
db30: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
db40: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
db50: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
db60: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
db70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db80: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
db90: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
dba0: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
dbb0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
dbc0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
dbd0: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
dbe0: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
dbf0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
dc00: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
dc10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
dc20: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
dc30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
dc40: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
dc50: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
dc60: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
dc70: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
dc80: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20  .    /* When an 
dc90: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
dca0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
dcb0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
dcc0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
dcd0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
dce0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
dcf0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
dd00: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
dd10: 6f 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65  ograms.    ** ke
dd20: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
dd30: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
dd40: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
dd50: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
dd60: 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73  ogram.    ** has
dd70: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
dd80: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  n seen..    */. 
dd90: 20 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70     if( bListSubp
dda0: 72 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74  rogs && pOp->p4t
ddb0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
ddc0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
ddd0: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
dde0: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
ddf0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
de00: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
de10: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
de20: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
de30: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
de40: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
de50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
de60: 28 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20  ( j==nSub ){.   
de70: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
de80: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
de90: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
dea0: 62 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b!=0);.        i
deb0: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
dec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
ded0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
dee0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
def0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
df00: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
df10: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
df20: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61  ub->z;.        a
df30: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
df40: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
df50: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66  .        pSub->f
df60: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
df70: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
df80: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
df90: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
dfa0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f        nRow += pO
dfb0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e  p->p4.pProgram->
dfc0: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
dfd0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
dfe0: 70 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b  plain<2 ) break;
dff0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
e000: 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e  code==OP_Explain
e010: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
e020: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
e030: 50 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e  P_Init && p->pc>
e040: 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  1 ) break;.  }..
e050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e060: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64  _OK ){.    if( d
e070: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
e080: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ted ){.      p->
e090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
e0a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20  RRUPT;.      rc 
e0b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e0d0: 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65  eError(p, sqlite
e0e0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
e0f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e100: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
e110: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
e120: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
e130: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e140: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  M_Int;.        p
e150: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e180: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
e190: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  */.        pMem+
e1a0: 2b 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20  +;.    .        
e1b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e1c0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
e1d0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
e1e0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
e1f0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
e200: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
e210: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
e220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e230: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
e240: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e250: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e260: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
e270: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
e280: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
e290: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
e2a0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d    }..      pMem-
e2b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e2c0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
e2d0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
e300: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
e310: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e320: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e330: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
e340: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e360: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P2 */.      pM
e370: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65  em++;..      pMe
e380: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e390: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
e3a0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
e3d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
e3e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e3f0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
e400: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30  Resize(pMem, 100
e410: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ) ){ /* P4 */.  
e420: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e430: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e440: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
e450: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e470: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e480: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
e490: 20 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70        zP4 = disp
e4a0: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
e4b0: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
e4c0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  oc);.      if( z
e4d0: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
e4e0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e4f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
e500: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
e510: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
e520: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
e530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
e550: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
e560: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
e570: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
e580: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
e590: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
e5a0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d  TE_UTF8;.      }
e5b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
e5c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70        if( p->exp
e5d0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
e5e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
e5f0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
e600: 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a  ize(pMem, 4) ){.
e610: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e620: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
e630: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
e640: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e650: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e660: 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  }.        pMem->
e670: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
e680: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
e690: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
e6a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
e6b0: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
e6c0: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
e6d0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
e6e0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
e6f0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
e700: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
e710: 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
e720: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
e730: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
e740: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e750: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
e760: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
e770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
e780: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
e790: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
e7a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e7b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e7c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
e7d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e7e0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
e7f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
e800: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
e810: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
e820: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20  , 500);.        
e830: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
e840: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
e850: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e860: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
e890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
e8a0: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73  }..      p->nRes
e8b0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
e8c0: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
e8d0: 20 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53       p->pResultS
e8e0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
e8f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
e900: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
e910: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
e920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e930: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
e940: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e950: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
e960: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e970: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
e980: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
e990: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
e9a0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
e9b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e9c0: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
e9d0: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
e9e0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
e9f0: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
ea00: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
ea10: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
ea20: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
ea30: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
ea40: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
ea50: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
ea60: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
ea70: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
ea80: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
ea90: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
eaa0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
eab0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
eac0: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
ead0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
eae0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
eaf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
eb00: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
eb10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
eb20: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
eb30: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
eb40: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
eb50: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
eb60: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
eb70: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
eb80: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
eb90: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
eba0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
ebb0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
ebc0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
ebd0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
ebe0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
ebf0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
ec00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
ec10: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
ec20: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
ec30: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
ec40: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
ec50: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
ec60: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
ec70: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
ec80: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
ec90: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
eca0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
ecb0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ecc0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecd0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
ece0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
ecf0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
ed00: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
ed10: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
ed20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ed30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
ed40: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
ed50: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
ed60: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
ed70: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
ed80: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
ed90: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
eda0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
edb0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
edc0: 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
edd0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
ede0: 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d  describes bulk m
edf0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
ee00: 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75  for use.** by su
ee10: 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61  bcomponents of a
ee20: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ee30: 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61  ent.  Space is a
ee40: 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20  llocated out.** 
ee50: 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61  of a ReusableSpa
ee60: 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65  ce object by the
ee70: 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f   allocSpace() ro
ee80: 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  utine below..*/.
ee90: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
eea0: 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70  pace {.  u8 *pSp
eeb0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ace;          /*
eec0: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
eed0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  y */.  int nFree
eee0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
eef0: 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
ef00: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
ef10: 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20  t nNeeded;      
ef20: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65     /* Total byte
ef30: 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74  s that could not
ef40: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   be allocated */
ef50: 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61  .};../* Try to a
ef60: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
ef70: 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  tes of 8-byte al
ef80: 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72  igned bulk memor
ef90: 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72  y for pBuf.** fr
efa0: 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  om the ReusableS
efb0: 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65  pace object.  Re
efc0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
efd0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  o the allocated.
efe0: 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63  ** memory on suc
eff0: 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66  cess.  If insuff
f000: 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73  icient memory is
f010: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
f020: 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61  e.** ReusableSpa
f030: 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65  ce object, incre
f040: 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65  ase the Reusable
f050: 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a  Space.nNeeded.**
f060: 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d   value by the am
f070: 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20  ount needed and 
f080: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
f090: 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  ** If pBuf is no
f0a0: 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  t initially NULL
f0b0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
f0c0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73  t the memory has
f0d0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
f0e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
f0f0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
f100: 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a  is routine, so j
f110: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70  ust return a cop
f120: 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64  y.** of pBuf and
f130: 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53   leave ReusableS
f140: 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  pace unchanged..
f150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63  **.** This alloc
f160: 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64  ator is employed
f170: 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e   to repurpose un
f180: 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68  used slots at th
f190: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
f1a0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20  opcode array of 
f1b0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66  prepared state f
f1c0: 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20  or other memory 
f1d0: 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65  needs of the pre
f1e0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
f1f0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
f200: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
f210: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
f220: 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42  eSpace *p,  /* B
f230: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
f240: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
f250: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
f260: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
f270: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
f280: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
f290: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ion */.  int nBy
f2a0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
f2b0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
f2c0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
f2d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
f2e0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
f2f0: 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a  T(p->pSpace) );.
f300: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
f310: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
f320: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
f330: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e  if( nByte <= p->
f340: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  nFree ){.      p
f350: 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65  ->nFree -= nByte
f360: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
f370: 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72  p->pSpace[p->nFr
f380: 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ee];.    }else{.
f390: 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64        p->nNeeded
f3a0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
f3b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
f3c0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
f3d0: 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72  ENT(pBuf) );.  r
f3e0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
f3f0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
f400: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
f410: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
f420: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
f430: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
f440: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f450: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
f460: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
f470: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
f480: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
f490: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
f4a0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
f4b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f4c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
f4d0: 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e  AGIC_INIT || p->
f4e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
f4f0: 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a  C_RESET );..  /*
f500: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
f510: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
f520: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
f530: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
f540: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
f550: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
f560: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
f570: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
f580: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
f590: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
f5a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f5b0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b  DEBUG.  for(i=0;
f5c0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
f5d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f5e0: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
f5f0: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
f600: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
f610: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
f620: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
f630: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
f640: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
f650: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
f660: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
f670: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
f680: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
f690: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
f6a0: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
f6b0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
f6c0: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
f6d0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
f6e0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
f6f0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
f700: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
f710: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f720: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
f730: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
f740: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
f750: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
f760: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
f770: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
f780: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
f790: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
f7a0: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
f7b0: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
f7c0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
f7d0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
f7e0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
f7f0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
f800: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
f810: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
f820: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
f830: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
f840: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
f850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
f860: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
f870: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
f880: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
f890: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
f8a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f8b0: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
f8c0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
f8d0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
f8e0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
f8f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f900: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
f910: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
f920: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
f930: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
f940: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
f950: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
f960: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
f970: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
f980: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
f990: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
f9a0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
f9b0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
f9c0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
f9d0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
f9e0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
f9f0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
fa00: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
fa10: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
fa20: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
fa30: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
fa40: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
fa50: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
fa60: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
fa70: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
fa80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
fa90: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
fac0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
fad0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
fae0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
faf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
fb00: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
fb30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
fb40: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb60: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
fb70: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
fb80: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fba0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
fbb0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
fbc0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fbe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
fbf0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
fc00: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
fc30: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
fc40: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
fc50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
fc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fc70: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fc80: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
fc90: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
fca0: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
fcb0: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
fcc0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
fcd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
fce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fcf0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
fd00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
fd10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
fd20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
fd30: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
fd40: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
fd50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
fd60: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
fd70: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
fd80: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
fd90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
fda0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
fdb0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
fdc0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
fdd0: 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75  .  .  /* Each cu
fde0: 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f  rsor uses a memo
fdf0: 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69  ry cell.  The fi
fe00: 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73  rst cursor (curs
fe10: 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75  or 0) can.  ** u
fe20: 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68  se aMem[0] which
fe30: 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
fe40: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  e used by the VD
fe50: 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  BE program.  All
fe60: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
fe70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
fe80: 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72  Mem[] for cursor
fe90: 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e  s 1 and greater.
fea0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
feb0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
fec0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
fed0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20   nCursor;.  if( 
fee0: 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d  nCursor==0 && nM
fef0: 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20  em>0 ) nMem++;  
ff00: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65  /* Space for aMe
ff10: 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74  m[0] even if not
ff20: 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46   used */..  /* F
ff30: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
ff40: 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f  ch reusable memo
ff50: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
ff60: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ff70: 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72  e.  ** opcode ar
ff80: 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61  ray.  This extra
ff90: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
ffa0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  reallocated for 
ffb0: 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20  other elements. 
ffc0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61   ** of the prepa
ffd0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
ffe0: 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38   */.  n = ROUND8
fff0: 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e  (sizeof(Op)*p->n
10000 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op);            
10010 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70    /* Bytes of op
10020 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64  code memory used
10030 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d   */.  x.pSpace =
10040 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b   &((u8*)p->aOp)[
10050 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n];             
10060 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f    /* Unused opco
10070 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  de memory */.  a
10080 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
10090 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53  E_ALIGNMENT(x.pS
100a0 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72  pace) );.  x.nFr
100b0 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  ee = ROUNDDOWN8(
100c0 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
100d0 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65  c - n);  /* Byte
100e0 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f  s of unused memo
100f0 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
10100 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  x.nFree>=0 );.  
10110 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10120 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e  TE_ALIGNMENT(&x.
10130 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29  pSpace[x.nFree])
10140 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
10150 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
10160 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
10170 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
10180 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
10190 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
101a0 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
101b0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
101c0 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
101d0 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
101e0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
101f0 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
10200 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
10210 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
10220 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
10230 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77  ted in one or tw
10240 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
10250 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
10260 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
10270 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  se unused memory
10280 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
10290 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
102a0 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
102b0 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
102c0 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
102d0 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
102e0 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
102f0 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
10300 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
10310 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
10320 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
10330 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20  mainder using a 
10340 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c  fresh memory all
10350 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
10360 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
10370 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
10380 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
10390 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
103a0 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
103b0 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79   leftover memory
103c0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
103d0 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
103e0 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69    This can signi
103f0 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
10400 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
10410 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
10420 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
10430 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
10440 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65  o {.    x.nNeede
10450 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  d = 0;.    p->aM
10460 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
10470 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
10480 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10490 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
104a0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
104b0 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
104c0 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
104d0 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
104e0 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
104f0 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
10500 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  *));.    p->apCs
10510 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10520 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  x, p->apCsr, nCu
10530 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
10540 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
10550 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10560 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10570 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
10580 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
10590 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
105a0 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
105b0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e  endif.    if( x.
105c0 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65  nNeeded==0 ) bre
105d0 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65  ak;.    x.pSpace
105e0 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71   = p->pFree = sq
105f0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
10600 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64  NN(db, x.nNeeded
10610 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d  );.    x.nFree =
10620 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77   x.nNeeded;.  }w
10630 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  hile( !db->mallo
10640 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
10650 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65  >pVList = pParse
10660 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72  ->pVList;.  pPar
10670 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b  se->pVList =  0;
10680 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
10690 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
106a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
106b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
106c0 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20  ->nVar = 0;.    
106d0 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a  p->nCursor = 0;.
106e0 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b      p->nMem = 0;
106f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
10700 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
10710 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20  or;.    p->nVar 
10720 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
10730 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
10740 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64  p->aVar, nVar, d
10750 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
10760 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
10770 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
10780 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ay(p->aMem, nMem
10790 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69  , db, MEM_Undefi
107a0 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ned);.    memset
107b0 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43  (p->apCsr, 0, nC
107c0 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
107d0 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
107e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
107f0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10800 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
10810 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70  nExec, 0, p->nOp
10820 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
10830 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
10840 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
10850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10860 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
10870 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
10880 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
10890 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
108a0 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
108b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
108c0 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
108d0 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
108e0 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
108f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
10900 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
10910 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c   pCx->pBtx==0 ||
10920 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
10930 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
10940 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e  .  switch( pCx->
10950 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20  eCurType ){.    
10960 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52  case CURTYPE_SOR
10970 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
10980 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
10990 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
109a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
109b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52    }.    case CUR
109c0 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20  TYPE_BTREE: {.  
109d0 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45      if( pCx->isE
109e0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
109f0 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
10a00 78 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65  x ) sqlite3Btree
10a10 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29  Close(pCx->pBtx)
10a20 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
10a30 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
10a40 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
10a50 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
10a60 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
10a70 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
10a80 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
10a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
10aa0 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
10ab0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
10ac0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10ad0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
10ae0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
10af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10b00 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
10b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10b20 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
10b30 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
10b40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
10b50 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
10b60 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
10b70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
10b80 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
10b90 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
10ba0 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
10bb0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
10bc0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
10bd0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
10be0 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
10bf0 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
10c00 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
10c10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10c20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c40 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
10c50 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10c70 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
10c80 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
10c90 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
10ca0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
10cc0 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
10cd0 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
10ce0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
10cf0 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
10d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10d10 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
10d20 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
10d30 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
10d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
10d60 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
10d70 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
10d80 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
10d90 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
10da0 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
10db0 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
10dc0 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
10dd0 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
10de0 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
10df0 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
10e00 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
10e10 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
10e20 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
10e30 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
10e40 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
10e50 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
10e60 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
10e70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10e80 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10e90 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
10ea0 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
10eb0 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d  endif.  v->aOp =
10ec0 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
10ed0 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
10ee0 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
10ef0 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
10f00 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
10f10 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
10f20 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
10f30 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
10f40 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
10f50 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
10f60 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
10f70 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
10f80 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
10f90 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
10fa0 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
10fb0 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
10fc0 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ge;.  sqlite3Vdb
10fd0 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76  eDeleteAuxData(v
10fe0 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61  ->db, &v->pAuxDa
10ff0 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d  ta, -1, 0);.  v-
11000 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61  >pAuxData = pFra
11010 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  me->pAuxData;.  
11020 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
11030 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
11040 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
11050 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
11060 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
11070 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
11080 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
11090 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
110a0 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
110b0 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
110c0 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
110d0 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
110e0 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
110f0 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
11100 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
11110 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
11120 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
11130 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
11140 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
11150 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
11160 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
11170 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
11180 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
11190 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
111a0 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
111b0 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
111c0 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
111d0 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
111e0 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
111f0 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
11200 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
11210 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
11220 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65  0;.    p->nFrame
11230 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
11240 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  rt( p->nFrame==0
11250 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f   );.  closeCurso
11260 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20  rsInFrame(p);.  
11270 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
11280 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
11290 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e  ay(p->aMem, p->n
112a0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
112b0 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
112c0 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
112d0 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
112e0 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
112f0 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
11300 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
11310 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
11320 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
11330 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
11340 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
11350 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
11360 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
11370 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
11380 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
11390 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  ta(p->db, &p->pA
113a0 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
113b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
113c0 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
113d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
113e0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
113f0 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
11400 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11410 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
11420 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
11430 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
11440 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
11450 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
11460 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
11470 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
11480 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
11490 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
114a0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
114b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
114c0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
114d0 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
114e0 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
114f0 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
11500 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
11510 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11520 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
11530 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75   if( p->nResColu
11540 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  mn ){.    releas
11550 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
11560 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
11570 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
11580 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11590 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
115a0 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e  me);.  }.  n = n
115b0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
115c0 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
115d0 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
115e0 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
115f0 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
11600 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11610 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
11620 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
11630 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
11640 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
11650 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
11660 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  e, n, db, MEM_Nu
11670 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ll);.}../*.** Se
11680 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
11690 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
116a0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
116b0 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
116c0 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
116d0 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
116e0 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
116f0 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
11700 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
11710 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
11720 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11730 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
11740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
11750 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
11760 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
11770 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
11780 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
11790 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
117a0 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
117b0 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
117c0 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
117d0 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
117e0 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
117f0 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
11800 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
11810 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
11820 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
11830 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
11840 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
11870 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
11880 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
118b0 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
118c0 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
118d0 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
118f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
11900 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
11910 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11920 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
11930 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
11940 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
11950 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
11960 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
11970 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
11980 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
11990 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
119a0 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
119b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
119c0 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
119d0 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
119e0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
119f0 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
11a00 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
11a10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11a20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
11a30 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
11a40 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
11a50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11a60 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
11a70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
11a80 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
11a90 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
11aa0 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
11ab0 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
11ac0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11ad0 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
11ae0 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
11af0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
11b00 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
11b10 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
11b20 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
11b30 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
11b40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
11b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
11b60 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
11b70 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
11b80 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
11b90 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
11ba0 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
11bb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
11bc0 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
11bd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
11be0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
11bf0 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
11c00 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
11c10 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
11c20 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
11c30 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
11c40 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
11c50 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
11c60 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
11c70 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
11c80 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
11c90 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
11ca0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
11cb0 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
11cc0 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
11cd0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nsaction.       
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
11cf0 68 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74  hat are candidat
11d00 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61  es for a two-pha
11d10 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20  se commit using 
11d20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
11d30 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a       ** master-j
11d40 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
11d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11d60 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
11d70 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
11d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11d90 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
11da0 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
11db0 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
11dc0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
11dd0 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
11de0 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
11df0 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
11e00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11e10 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
11e20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
11e30 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
11e40 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
11e50 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
11e60 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
11e70 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
11e80 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
11e90 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11ea0 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
11eb0 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
11ec0 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
11ed0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ee0 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
11ef0 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
11f00 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
11f10 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
11f20 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
11f30 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
11f40 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
11f50 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
11f60 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
11f70 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
11f80 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
11f90 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
11fa0 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
11fb0 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
11fc0 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
11fd0 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
11fe0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
11ff0 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
12000 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
12010 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
12020 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
12030 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
12040 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
12050 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
12060 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
12070 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
12080 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
12090 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
120a0 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
120b0 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
120c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
120d0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
120e0 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
120f0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12100 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
12110 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
12120 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
12130 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20    /* Whether or 
12140 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d  not a database m
12150 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74  ight need a mast
12160 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e  er journal depen
12170 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a  ds upon.      **
12180 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   its journal mod
12190 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74  e (among other t
121a0 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61  hings).  This ma
121b0 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20  trix determines 
121c0 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a  which.      ** j
121d0 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65  ournal modes use
121e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
121f0 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e  l and which do n
12200 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ot */.      stat
12210 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e  ic const u8 aMJN
12220 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  eeded[] = {.    
12230 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20      /* DELETE   
12240 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f  */  1,.        /
12250 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31  * PERSIST   */ 1
12260 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  ,.        /* OFF
12270 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20         */ 0,.   
12280 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45       /* TRUNCATE
12290 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
122a0 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20  /* MEMORY    */ 
122b0 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41  0,.        /* WA
122c0 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20  L       */ 0.   
122d0 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65     };.      Page
122e0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20  r *pPager;   /* 
122f0 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  Pager associated
12300 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20   with pBt */.   
12310 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
12320 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
12330 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
12340 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d  ;.      pPager =
12350 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
12360 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  er(pBt);.      i
12370 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61  f( db->aDb[i].sa
12380 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45  fety_level!=PAGE
12390 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
123a0 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e  F.       && aMJN
123b0 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67  eeded[sqlite3Pag
123c0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
123d0 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20  (pPager)].      
123e0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
123f0 49 73 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d  IsMemdb(pPager)=
12400 3d 30 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20  =0.      ){ .   
12410 20 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d       assert( i!=
12420 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72  1 );.        nTr
12430 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ans++;.      }. 
12440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12450 33 42 74 72 65 65 45 78 63 6c 75 73 69 76 65 4c  3BtreeExclusiveL
12460 6f 63 6b 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ock(pBt);.      
12470 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12480 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
12490 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
124a0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
124b0 54 0a 20 20 69 66 28 20 64 62 2d 3e 62 43 6f 6e  T.  if( db->bCon
124c0 63 75 72 72 65 6e 74 20 26 26 20 28 72 63 20 26  current && (rc &
124d0 20 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42   0xFF)==SQLITE_B
124e0 55 53 59 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  USY ){.    /* An
124f0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
12500 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
12510 53 48 4f 54 20 77 61 73 20 65 6e 63 6f 75 6e 74  SHOT was encount
12520 65 72 65 64 20 77 68 69 6c 65 20 0a 20 20 20 20  ered while .    
12530 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ** attempting to
12540 20 74 61 6b 65 20 74 68 65 20 57 52 49 54 45 52   take the WRITER
12550 20 6c 6f 63 6b 20 6f 6e 20 61 20 77 61 6c 20 66   lock on a wal f
12560 69 6c 65 2e 20 52 65 6c 65 61 73 65 20 74 68 65  ile. Release the
12570 0a 20 20 20 20 2a 2a 20 57 52 49 54 45 52 20 6c  .    ** WRITER l
12580 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 77 61 6c 20  ocks on all wal 
12590 66 69 6c 65 73 20 61 6e 64 20 72 65 74 75 72 6e  files and return
125a0 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 20 20   early.  */.    
125b0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
125c0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
125d0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
125e0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
125f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
12600 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
12610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
12620 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12630 42 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Bt);.        sql
12640 69 74 65 33 50 61 67 65 72 44 72 6f 70 45 78 63  ite3PagerDropExc
12650 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
12660 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
12670 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
12680 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
12690 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
126a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
126b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
126c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
126d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
126e0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77   there are any w
126f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12700 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65  s at all, invoke
12710 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
12720 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63   */.  if( needXc
12730 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f  ommit && db->xCo
12740 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  mmitCallback ){.
12750 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
12760 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
12770 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
12780 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
127a0 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
127b0 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  THOOK;.    }.  }
127c0 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
127d0 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
127e0 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
127f0 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
12800 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
12810 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
12820 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12830 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
12840 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
12850 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
12860 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
12870 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
12880 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
12890 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
128a0 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
128b0 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
128c0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
128d0 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
128e0 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
128f0 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
12900 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
12910 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
12920 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
12930 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
12940 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
12950 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
12960 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
12970 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
12980 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
12990 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
129a0 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
129b0 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
129c0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
129d0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
129e0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
129f0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12a00 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12a10 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
12a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12a30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12a40 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
12a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12a60 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
12a70 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
12a80 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
12a90 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
12aa0 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
12ab0 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
12ac0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
12ad0 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
12ae0 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
12af0 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
12b00 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
12b10 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
12b20 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
12b30 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
12b40 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
12b50 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
12b60 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
12b70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
12b80 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
12b90 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
12ba0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
12bb0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
12bc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
12bd0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12be0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12bf0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12c10 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
12c20 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  o(pBt, 0);.     
12c30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12c40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
12c60 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
12c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
12c80 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
12c90 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
12ca0 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
12cb0 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
12cc0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
12cd0 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
12ce0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
12cf0 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
12d00 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
12d10 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c  mitted atomicall
12d20 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
12d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12d40 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
12d50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12d60 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
12d70 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
12d80 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
12d90 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
12da0 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
12db0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
12dc0 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
12dd0 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
12de0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
12df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
12e00 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
12e10 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
12e20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
12e30 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
12e40 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
12e50 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
12e60 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
12e70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12e80 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
12e90 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
12ea0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
12eb0 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
12ec0 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
12ed0 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
12ee0 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
12ef0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
12f00 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
12f10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12f20 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  KPT;.    do {.  
12f30 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
12f40 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
12f50 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
12f60 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
12f70 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
12f80 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
12f90 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
12fa0 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
12fb0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
12fc0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
12fd0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
12fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12ff0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
13000 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
13010 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
13020 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
13030 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
13040 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
13050 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
13060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
13070 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
13080 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
13090 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
130a0 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
130b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
130c0 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
130d0 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
130e0 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13110 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
13120 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
13130 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
13140 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
13150 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
13160 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13170 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
13180 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
13190 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
131a0 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
131b0 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
131c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
131d0 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
131e0 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
131f0 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
13200 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
13210 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
13220 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13230 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
13240 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
13250 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
13260 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
13270 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
13280 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
13290 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
132a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
132b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
132c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
132d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
132e0 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
132f0 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
13300 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
13310 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13320 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
13330 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
13340 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13350 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
13360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
13370 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
13380 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
13390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
133a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
133b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
133c0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
133d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
133e0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
133f0 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
13400 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
13410 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
13420 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
13430 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
13440 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
13450 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
13460 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
13470 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
13480 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
13490 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
134a0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
134b0 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
134c0 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
134d0 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
134e0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
134f0 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
13500 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
13510 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
13520 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
13530 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
13540 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
13550 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
13560 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
13570 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
13580 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
13590 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
135a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
135b0 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
135c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
135d0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
135e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
135f0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
13600 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
13610 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
13620 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
13630 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
13640 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
13650 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
13660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13670 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
13680 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
13690 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
136a0 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
136b0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
136c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
136d0 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
136e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
136f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13700 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13710 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
13720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13730 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
13740 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
13750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
13760 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13780 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
137a0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
137b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
137c0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
137d0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
137e0 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
137f0 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
13800 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
13810 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d    */.    if( 0==
13820 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
13830 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
13840 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
13850 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
13860 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
13870 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
13880 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
13890 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
138a0 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
138b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
138c0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
138d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
138e0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
138f0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
13900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13910 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13930 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
13940 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
13950 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
13960 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
13970 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
13980 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
13990 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
139a0 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
139b0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
139c0 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
139d0 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
139e0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
139f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13a00 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
13a10 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
13a20 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
13a30 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
13a40 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
13a50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
13a60 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
13a70 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
13a80 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
13a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13aa0 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
13ab0 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
13ac0 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
13ad0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
13ae0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13af0 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
13b00 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
13b10 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13b20 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
13b30 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
13b40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
13b50 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13b60 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
13b70 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
13b80 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
13b90 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
13ba0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
13bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13bc0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
13bd0 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
13be0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13bf0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
13c00 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
13c10 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
13c20 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
13c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
13c50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13c60 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
13c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13c80 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
13c90 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13ca0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
13cb0 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
13cc0 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
13cd0 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
13ce0 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
13cf0 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
13d00 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
13d10 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
13d20 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
13d30 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
13d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13d50 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
13d60 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
13d70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13d80 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
13d90 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
13da0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
13db0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13dc0 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
13dd0 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
13de0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
13df0 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
13e00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
13e10 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
13e20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13e30 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
13e40 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
13e50 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
13e60 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
13e70 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
13e80 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
13e90 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
13ea0 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
13eb0 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
13ec0 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
13ed0 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
13ee0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13ef0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
13f00 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
13f10 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
13f20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
13f30 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
13f40 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
13f50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
13f60 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
13f70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
13f80 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13f90 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
13fa0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
13fb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
13fc0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
13fd0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
13fe0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
13ff0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
14000 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
14010 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14020 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
14030 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
14040 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
14050 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14060 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
14070 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
14080 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
14090 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
140a0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
140b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
140c0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
140d0 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
140e0 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62  the sqlite3.nVdb
140f0 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61  eActive count va
14100 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
14110 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
14120 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
14130 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
14140 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
14150 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
14160 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
14170 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
14180 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
14190 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
141a0 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
141b0 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
141c0 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
141d0 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
141e0 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
141f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
14200 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
14210 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
14220 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
14230 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
14240 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
14250 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
14260 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
14270 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69   nWrite = 0;.  i
14280 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
14290 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
142a0 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
142b0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d   if( sqlite3_stm
142c0 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f  t_busy((sqlite3_
142d0 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20  stmt*)p) ){.    
142e0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
142f0 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
14300 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
14310 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
14320 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a  ader ) nRead++;.
14330 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
14340 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
14350 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e  sert( cnt==db->n
14360 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20  VdbeActive );.  
14370 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
14380 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
14390 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61  ;.  assert( nRea
143a0 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  d==db->nVdbeRead
143b0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
143c0 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
143d0 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
143e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
143f0 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
14400 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
14410 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
14420 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
14430 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
14440 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
14450 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
14460 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14470 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
14480 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
14490 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
144a0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
144b0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
144c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
144d0 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
144e0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
144f0 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
14500 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
14510 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
14520 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
14530 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
14540 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
14550 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
14560 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
14570 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
14580 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
14590 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
145a0 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65  NE int vdbeClose
145b0 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
145c0 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
145d0 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
145e0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
145f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14600 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
14610 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
14620 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
14630 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f  1;..  assert( eO
14640 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14650 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
14660 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
14670 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
14680 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
14690 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
146a0 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
146b0 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
146c0 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66  vepoint) );..  f
146d0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
146e0 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e  b; i++){ .    in
146f0 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
14700 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  K;.    Btree *pB
14710 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
14720 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
14730 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
14740 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
14750 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
14760 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
14770 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
14780 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
14790 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
147a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
147b0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
147c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
147d0 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
147e0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
147f0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14800 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
14840 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
14850 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61  }.  }.  db->nSta
14860 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69  tement--;.  p->i
14870 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
14880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14890 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65  _OK ){.    if( e
148a0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
148b0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
148c0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
148d0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
148e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
148f0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
14910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14930 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
14940 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
14950 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
14960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14970 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
14980 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
14990 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
149a0 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
149b0 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  e the .  ** data
149c0 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
149d0 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
149e0 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
149f0 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
14a00 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  n .  ** the stat
14a10 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14a20 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
14a30 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56  /.  if( eOp==SAV
14a40 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14a50 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  ){.    db->nDefe
14a60 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
14a70 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
14a80 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
14a90 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
14aa0 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20  efImmCons;.  }. 
14ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
14ac0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
14ad0 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
14ae0 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
14af0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61   if( p->db->nSta
14b00 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
14b10 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72  atement ){.    r
14b20 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53  eturn vdbeCloseS
14b30 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29  tatement(p, eOp)
14b40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14b50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
14b60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14b70 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
14b80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
14b90 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
14ba0 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
14bb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14bc0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
14bd0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
14be0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
14bf0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
14c00 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
14c10 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
14c20 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14c30 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
14c40 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
14c50 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
14c60 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
14c70 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
14c80 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
14c90 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
14ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
14cb0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
14cc0 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
14cd0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
14ce0 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
14cf0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
14d00 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
14d10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
14d20 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
14d30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
14d40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14d50 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
14d60 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
14d70 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
14d80 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
14d90 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
14da0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
14db0 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
14dc0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
14dd0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
14de0 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
14df0 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
14e00 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
14e10 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
14e20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
14e30 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
14e40 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
14e50 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
14e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
14e70 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
14e80 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
14e90 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
14ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
14eb0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
14ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
14ed0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
14ee0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14ef0 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
14f00 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
14f10 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
14f20 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
14f30 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
14f40 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
14f50 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
14f60 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
14f70 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
14f80 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
14f90 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
14fa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14fb0 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
14fc0 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
14fd0 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
14fe0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
14ff0 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
15000 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
15010 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
15020 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
15030 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
15040 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
15050 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
15060 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15070 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
15080 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
15090 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
150a0 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
150b0 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
150c0 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
150d0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
150e0 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
150f0 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
15100 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
15110 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
15120 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15130 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
15140 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15160 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
15170 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
15180 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
15190 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
151a0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
151b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
151c0 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
151d0 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
151e0 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
151f0 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
15200 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
15210 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
15220 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
15230 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
15240 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
15250 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
15260 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
15270 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15280 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
15290 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
152a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
152b0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
152c0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
152d0 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
152e0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
152f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
15300 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
15310 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
15320 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
15330 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
15340 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
15350 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
15360 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
15370 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
15380 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
15390 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
153a0 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
153b0 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
153c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
153d0 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  */..  if( p->mag
153e0 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
153f0 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15410 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15420 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
15430 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
15440 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63  EM_BKPT;.  }.  c
15450 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
15460 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  );.  checkActive
15470 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
15480 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
15490 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
154a0 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
154b0 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
154c0 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
154d0 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
154e0 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
154f0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
15500 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
15510 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
15520 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
15530 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
15540 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
15550 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
15560 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
15570 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
15580 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
15590 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
155a0 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
155b0 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
155c0 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
155d0 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
155e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
155f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
15600 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
15610 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
15620 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
15630 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
15640 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
15650 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
15660 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
15670 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
15680 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
156b0 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
156c0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
156d0 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
156e0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
156f0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
15700 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
15710 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15720 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
15730 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
15740 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
15750 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
15760 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
15770 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
15780 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
15790 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
157a0 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
157b0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
157c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
157d0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
157e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
157f0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
15800 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
15810 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
15820 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
15830 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
15840 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15850 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
15860 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
15870 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
15880 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
15890 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
158a0 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
158b0 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
158c0 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
158d0 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
158e0 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
158f0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
15900 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
15910 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
15920 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
15930 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
15940 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
15950 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
15960 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
15970 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
15980 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
15990 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
159a0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
159b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
159c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
159d0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
159e0 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
159f0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
15a00 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
15a10 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
15a20 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
15a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15a40 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
15a50 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
15a60 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
15a70 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
15a80 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
15a90 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
15aa0 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
15ab0 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
15ac0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
15ad0 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
15ae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
15af0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
15b00 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
15b10 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
15b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
15b30 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
15b40 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
15b50 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
15b60 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 62 43            db->bC
15b70 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20  oncurrent = 0;. 
15b80 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
15b90 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
15ba0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15bb0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
15bc0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
15bd0 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
15be0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
15bf0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15c00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15c10 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
15c20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
15c30 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
15c40 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
15c50 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
15c60 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
15c70 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
15c80 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
15c90 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
15ca0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
15cb0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
15cc0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
15cd0 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
15ce0 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
15cf0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
15d00 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
15d10 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
15d20 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
15d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15d40 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
15d50 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
15d60 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
15d70 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
15d80 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
15d90 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
15da0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
15db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
15dc0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
15dd0 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
15de0 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
15df0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15e00 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
15e10 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
15e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15e40 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
15e50 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
15e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
15e70 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
15e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15e90 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
15ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
15eb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
15ec0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
15ed0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15ee0 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
15ef0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
15f00 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
15f10 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
15f20 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
15f30 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
15f40 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
15f50 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
15f60 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
15f70 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
15f80 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
15f90 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
15fa0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
15fb0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
15fc0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
15fd0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
15fe0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
15ff0 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
16000 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
16010 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
16020 72 63 20 26 20 30 78 46 46 29 3d 3d 53 51 4c 49  rc & 0xFF)==SQLI
16030 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
16040 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
16050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
16060 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
16070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16080 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
160a0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
160b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
160c0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
160d0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
160e0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  K);.          p-
160f0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16110 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
16120 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
16130 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
16140 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
16150 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
16160 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53  flags &= ~(u64)S
16170 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
16180 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16190 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
161a0 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
161b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
161c0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
161d0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
161e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
161f0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
16200 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16210 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
16220 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
16230 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
16240 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
16250 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16260 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
16270 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
16280 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
16290 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
162a0 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
162b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
162c0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
162d0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
162e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
162f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
16300 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
16310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16320 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16330 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
16340 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
16350 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
16360 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
16370 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
16380 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64  t = 1;.        d
16390 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d  b->bConcurrent =
163a0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   0;.        p->n
163b0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
163c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
163d0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
163e0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
163f0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
16400 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
16410 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
16420 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
16430 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
16440 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16450 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
16460 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
16470 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
16480 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
16490 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
164a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
164b0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
164c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
164d0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
164e0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
164f0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
16500 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
16510 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
16520 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16530 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
16540 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16550 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
16560 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
16570 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16580 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16590 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
165a0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
165b0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
165c0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
165d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
165e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
165f0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
16600 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
16610 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
16620 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16630 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16640 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16650 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16660 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16670 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16680 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16690 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
166a0 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
166b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
166c0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
166d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
166e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
166f0 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
16700 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
16710 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
16720 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
16730 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
16740 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
16750 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
16760 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
16770 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
16780 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
16790 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
167a0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
167b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
167c0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
167d0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
167e0 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
167f0 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
16800 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
16810 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
16820 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
16830 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
16840 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
16850 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
16860 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
16870 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
16880 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
16890 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
168a0 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
168b0 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
168c0 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
168d0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
168e0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
168f0 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
16900 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
16910 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
16920 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
16930 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
16940 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
16950 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16960 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
16970 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
16980 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
16990 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
169a0 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
169b0 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
169c0 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
169d0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
169e0 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
169f0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
16a00 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b);.  if( db->ma
16a10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16a20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16a30 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
16a40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
16a50 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
16a60 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
16a70 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
16a80 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
16a90 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
16aa0 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
16ab0 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
16ac0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16ad0 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
16ae0 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
16af0 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
16b00 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
16b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
16b20 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
16b30 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
16b40 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
16b50 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
16b60 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
16b70 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
16b80 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
16b90 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
16ba0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
16bb0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
16bc0 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
16bd0 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
16be0 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
16bf0 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
16c00 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
16c10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
16c20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
16c30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16c40 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
16c50 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
16c60 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
16c70 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
16c80 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
16c90 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
16ca0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
16cb0 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
16cc0 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
16cd0 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
16ce0 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
16cf0 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
16d00 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
16d10 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
16d20 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
16d30 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
16d40 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
16d50 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
16d60 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
16d70 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
16d80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
16d90 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
16da0 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
16db0 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
16dc0 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
16dd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16de0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
16df0 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
16e00 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
16e10 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16e20 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
16e30 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
16e40 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
16e50 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
16e60 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c  alloc++;.    sql
16e70 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
16e80 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
16e90 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
16ea0 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
16eb0 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
16ec0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
16ed0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
16ee0 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
16ef0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
16f00 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16f10 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
16f20 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
16f30 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
16f40 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69  loc--;.  }else i
16f50 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20  f( db->pErr ){. 
16f60 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
16f70 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29  etNull(db->pErr)
16f80 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43  ;.  }.  db->errC
16f90 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  ode = rc;.  retu
16fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
16fb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16fc0 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
16fd0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
16fe0 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
16ff0 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
17000 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
17010 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
17020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17030 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
17040 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
17050 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
17060 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
17070 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
17080 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
17090 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
170a0 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
170b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
170c0 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
170d0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
170e0 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
170f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
17100 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
17110 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
17120 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
17130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17140 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
17150 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
17160 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
17170 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
17180 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
17190 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
171a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
171b0 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
171c0 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
171d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
171e0 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
171f0 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
17200 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
17210 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
17220 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
17230 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
17240 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
17250 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
17260 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
17270 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17280 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
17290 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
172a0 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
172b0 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
172c0 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
172d0 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
172e0 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
172f0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
17300 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
17310 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
17320 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
17330 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
17340 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
17350 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
17360 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
17370 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
17380 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
17390 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
173a0 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
173b0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
173c0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
173d0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
173e0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
173f0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
17400 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
17410 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
17420 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
17430 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
17440 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
17450 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
17460 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
17470 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
17480 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
17490 44 42 45 20 68 61 73 20 62 65 65 6e 20 72 75 6e  DBE has been run
174a0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
174b0 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
174c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
174d0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
174e0 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
174f0 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
17500 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
17510 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
17520 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
17530 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
17540 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
17550 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
17560 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
17570 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
17580 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
17590 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
175a0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
175b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
175c0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
175d0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
175e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
175f0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
17600 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  );.    if( p->ru
17610 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
17620 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
17630 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
17640 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
17650 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
17660 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
17670 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
17680 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
17690 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
176a0 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
176b0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
176c0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
176d0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
176e0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
176f0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
17700 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
17710 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
17720 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
17730 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
17740 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
17750 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
17760 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
17770 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74  register content
17780 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72  s and reclaim er
17790 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f  ror message memo
177a0 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ry..  */.#ifdef 
177b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
177c0 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
177d0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
177e0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
177f0 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
17800 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
17810 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
17820 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
17830 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
17840 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
17850 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
17860 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
17870 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
17880 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
17890 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m ){.    for(i=0
178a0 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
178b0 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
178c0 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
178d0 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
178e0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
178f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
17900 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
17910 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
17920 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
17930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17940 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20  BUG.  p->nWrite 
17950 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  = 0;.#endif..  /
17960 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
17970 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
17980 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
17990 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
179a0 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
179b0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
179c0 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
179d0 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
179e0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
179f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17a00 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
17a10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
17a20 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
17a30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
17a40 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
17a50 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
17a60 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
17a70 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
17a80 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
17a90 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
17aa0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
17ab0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
17ac0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
17ad0 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
17ae0 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
17af0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17b00 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
17b10 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
17b20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
17b30 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
17b40 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
17b50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
17b60 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
17b70 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
17b80 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
17b90 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
17ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
17bb0 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
17bc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
17bd0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
17be0 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
17bf0 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
17c00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
17c10 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
17c20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
17c30 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
17c40 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
17c50 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
17c60 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
17c70 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
17c80 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
17c90 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
17ca0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17cb0 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
17cc0 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
17cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17ce0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
17cf0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
17d00 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
17d10 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20  _MAGIC_RESET;.  
17d20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
17d30 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
17d40 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
17d50 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
17d60 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
17d70 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
17d80 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
17d90 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
17da0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
17db0 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
17dc0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
17dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17de0 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
17df0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
17e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17e10 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
17e20 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
17e30 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
17e40 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
17e50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
17e60 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
17e70 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
17e80 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
17e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
17ea0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
17eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ec0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
17ed0 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
17ee0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
17ef0 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
17f00 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
17f10 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
17f20 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
17f30 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
17f40 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
17f50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
17f60 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
17f70 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
17f80 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
17f90 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
17fa0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
17fb0 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
17fc0 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
17fd0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
17fe0 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
17ff0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
18000 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
18010 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
18020 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
18030 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
18040 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
18050 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
18060 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
18070 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
18080 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
18090 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
180a0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
180b0 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
180c0 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
180d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
180e0 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
180f0 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
18100 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
18110 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
18120 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
18130 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
18140 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
18150 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
18160 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64  xData(sqlite3 *d
18170 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c  b, AuxData **pp,
18180 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
18190 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70  sk){.  while( *p
181a0 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
181b0 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
181c0 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
181d0 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75     || (pAux->iAu
181e0 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20  xOp==iOp.       
181f0 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78     && pAux->iAux
18200 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  Arg>=0.         
18210 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41   && (pAux->iAuxA
18220 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
18230 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
18240 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20 20  ->iAuxArg)))).  
18250 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
18260 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41  ase( pAux->iAuxA
18270 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
18280 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
18290 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  eAux ){.        
182a0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
182b0 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
182c0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
182d0 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78  = pAux->pNextAux
182e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
182f0 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
18300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18310 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
18320 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtAux;.    }.  }
18330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
18340 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
18350 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
18360 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
18370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
18380 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
18390 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
183a0 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
183b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
183c0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
183d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
183e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
183f0 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
18400 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
18410 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
18420 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
18430 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
18440 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
18450 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18460 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
18470 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
18480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18490 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
184a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
184b0 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
184c0 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
184d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
184e0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
184f0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
18500 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
18510 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
18520 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
18530 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
18540 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
18550 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
18560 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
18570 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
18580 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
18590 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
185a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
185b0 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
185c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
185d0 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
185e0 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  IT ){.    releas
185f0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
18600 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  r, p->nVar);.   
18610 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18620 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20  b, p->pVList);. 
18630 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18640 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
18650 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70    }.  vdbeFreeOp
18660 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
18670 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
18680 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18690 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
186a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
186b0 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65   p->zSql);.#ifde
186c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
186d0 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69  NORMALIZE.  sqli
186e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
186f0 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a  >zNormSql);.  {.
18700 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74 72 20      DblquoteStr 
18710 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a  *pThis, *pNext;.
18720 20 20 20 20 66 6f 72 28 70 54 68 69 73 3d 70 2d      for(pThis=p-
18730 3e 70 44 62 6c 53 74 72 3b 20 70 54 68 69 73 3b  >pDblStr; pThis;
18740 20 70 54 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20   pThis=pNext){. 
18750 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 54 68       pNext = pTh
18760 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20  is->pNextStr;.  
18770 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18780 65 28 64 62 2c 20 70 54 68 69 73 29 3b 0a 20 20  e(db, pThis);.  
18790 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
187a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
187b0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
187c0 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  TUS.  {.    int 
187d0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
187e0 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
187f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
18800 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18810 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
18820 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
18830 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
18840 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  an);.  }.#endif.
18850 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
18860 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
18870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18880 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
18890 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
188a0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
188b0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
188c0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
188d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
188e0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
188f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
18900 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
18910 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
18920 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
18930 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
18940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18950 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
18960 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
18970 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
18980 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
18990 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
189a0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
189b0 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
189c0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
189d0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
189e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
189f0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
18a00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
18a10 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
18a20 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
18a30 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
18a40 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
18a50 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
18a60 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
18a70 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
18a80 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
18a90 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
18aa0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
18ab0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18ac0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
18ad0 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
18ae0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
18af0 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
18b00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18b10 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
18b20 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
18b30 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
18b40 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
18b50 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
18b60 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
18b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
18b80 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
18b90 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
18ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
18bb0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
18bc0 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
18bd0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
18be0 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
18bf0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
18c00 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
18c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18c20 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
18c30 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
18c40 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
18c50 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
18c60 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
18c70 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
18c80 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
18c90 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
18ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18cb0 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
18cc0 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
18cd0 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
18ce0 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
18cf0 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
18d00 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
18d10 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
18d20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
18d30 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
18d40 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
18d50 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
18d60 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
18d70 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
18d80 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
18d90 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
18da0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
18db0 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
18dc0 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
18dd0 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
18de0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
18df0 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
18e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18e10 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
18e20 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
18e30 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
18e40 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
18e50 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
18e60 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
18e70 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
18e80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
18e90 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
18ea0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18eb0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
18ec0 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
18ed0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
18ee0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
18ef0 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
18f00 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
18f10 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
18f20 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
18f30 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
18f40 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
18f50 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
18f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18f70 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
18f80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
18f90 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
18fa0 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
18fb0 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
18fc0 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
18fd0 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
18fe0 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
18ff0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
19000 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
19010 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
19020 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
19030 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19040 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
19050 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
19060 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
19070 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
19080 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
19090 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
190a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
190b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
190c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
190d0 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
190e0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
190f0 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
19100 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
19110 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
19120 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19130 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
19140 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
19150 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
19160 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
19170 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
19180 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
19190 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
191a0 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
191b0 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
191c0 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
191d0 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
191e0 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
191f0 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
19200 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
19210 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
19220 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
19230 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
19240 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
19250 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
19260 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
19270 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
19280 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
19290 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
192a0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
192b0 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
192c0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
192d0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
192e0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
192f0 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
19300 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19320 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
19330 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
19340 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
19350 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
19360 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20   *pp;.  assert( 
19370 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19380 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d  TYPE_BTREE || p-
19390 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
193a0 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69  PE_PSEUDO );.  i
193b0 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
193c0 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
193d0 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d  iMap;.    if( p-
193e0 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
193f0 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
19400 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
19410 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
19420 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
19430 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20  *piCol = iMap - 
19440 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
19450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19460 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
19470 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
19480 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (p);.  }.  if( s
19490 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
194a0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
194b0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
194c0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
194d0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
194e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
194f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
19510 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
19520 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19530 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
19540 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19550 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
19560 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
19570 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19580 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
19590 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
195a0 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
195b0 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
195c0 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
195d0 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
195e0 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
195f0 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
19600 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
19610 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
19620 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
19630 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
19640 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
19650 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
19660 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
19670 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
19680 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
19690 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
196a0 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
196b0 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
196c0 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
196d0 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
196e0 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
196f0 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
19700 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
19710 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
19720 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
19730 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
19740 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19750 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
19760 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
19770 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
19780 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
19790 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
197a0 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
197b0 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
197c0 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
197d0 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
197e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
197f0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
19800 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
19810 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
19820 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
19830 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
19840 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
19850 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
19860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
19870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
19880 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
19890 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
198c0 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
198f0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19900 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
19910 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
19920 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19930 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
19960 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
19970 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
19990 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
199a0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
199b0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
199c0 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
199d0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
199e0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
19a10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19a20 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
19a40 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
19a50 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19a80 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
19a90 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
19ac0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
19ad0 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
19b00 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
19b10 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
19b20 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
19b30 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
19b40 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
19b50 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
19b60 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
19b70 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
19b80 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
19b90 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
19ba0 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
19bb0 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
19bc0 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
19bd0 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
19be0 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
19bf0 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
19c00 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
19c10 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
19c20 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
19c30 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
19c40 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19c50 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
19c60 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
19c70 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
19c80 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
19c90 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
19ca0 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
19cb0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
19cc0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
19cd0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
19ce0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
19cf0 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
19d00 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
19d10 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
19d20 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
19d30 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
19d40 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
19d50 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
19d60 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
19d70 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
19d80 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
19d90 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
19da0 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
19db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
19dc0 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
19dd0 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
19de0 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
19df0 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
19e00 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
19e10 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
19e20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
19e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19e40 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
19e50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19e60 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19e70 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
19e80 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
19e90 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
19ea0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
19eb0 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
19ec0 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
19ed0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
19ee0 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
19ef0 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
19f00 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
19f10 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
19f20 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
19f30 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
19f40 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
19f50 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
19f60 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
19f70 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
19f80 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
19f90 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19fa0 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
19fb0 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
19fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
19fd0 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
19fe0 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
19ff0 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
1a000 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
1a010 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
1a020 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
1a030 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
1a040 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
1a050 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
1a060 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
1a070 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
1a080 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
1a090 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a0a0 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
1a0b0 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
1a0c0 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
1a0d0 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
1a0e0 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
1a0f0 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
1a100 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
1a110 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
1a120 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
1a130 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
1a140 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
1a150 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
1a160 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
1a170 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
1a180 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
1a190 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
1a1a0 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
1a1b0 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
1a1c0 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
1a1d0 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
1a1e0 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
1a1f0 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
1a200 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
1a210 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
1a220 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
1a230 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
1a240 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
1a250 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
1a260 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
1a270 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
1a280 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
1a290 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
1a2a0 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
1a2b0 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
1a2c0 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
1a2d0 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
1a2e0 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
1a2f0 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
1a300 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
1a310 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
1a320 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
1a330 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
1a340 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
1a350 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
1a360 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
1a370 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
1a380 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
1a390 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
1a3a0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
1a3b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1a3c0 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
1a3d0 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
1a3e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a3f0 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
1a400 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
1a410 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a420 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
1a430 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1a440 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
1a450 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
1a460 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
1a470 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
1a480 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
1a490 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
1a4a0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
1a4b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
1a4c0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1a4d0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1a4e0 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
1a4f0 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
1a500 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
1a510 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
1a520 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
1a530 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
1a540 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
1a550 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
1a560 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
1a570 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
1a580 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
1a590 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
1a5a0 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
1a5b0 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
1a5c0 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
1a5d0 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
1a5e0 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
1a5f0 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
1a600 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1a610 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
1a620 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
1a630 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1a640 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
1a650 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
1a660 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
1a670 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
1a680 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
1a690 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
1a6a0 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
1a6b0 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
1a6c0 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
1a6d0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
1a6e0 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
1a6f0 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
1a700 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
1a710 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
1a720 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
1a730 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
1a740 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
1a750 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
1a760 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
1a770 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
1a780 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
1a790 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
1a7a0 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
1a7b0 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
1a7c0 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
1a7d0 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
1a7e0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
1a7f0 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
1a800 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
1a810 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
1a820 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
1a830 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
1a840 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
1a850 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
1a860 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
1a870 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
1a880 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
1a890 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
1a8a0 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
1a8b0 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
1a8c0 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
1a8d0 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
1a8e0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
1a8f0 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
1a900 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
1a910 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
1a920 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
1a930 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
1a940 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
1a950 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
1a960 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
1a970 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
1a980 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
1a990 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
1a9a0 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
1a9b0 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
1a9c0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
1a9d0 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
1a9e0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
1a9f0 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
1aa00 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
1aa10 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
1aa20 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
1aa30 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
1aa40 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
1aa50 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
1aa60 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
1aa70 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
1aa80 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
1aa90 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
1aaa0 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
1aab0 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
1aac0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1aad0 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
1aae0 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
1aaf0 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
1ab00 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
1ab10 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
1ab20 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
1ab30 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
1ab40 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
1ab50 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
1ab60 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
1ab70 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
1ab80 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
1ab90 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
1aba0 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
1abb0 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
1abc0 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
1abd0 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
1abe0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
1abf0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
1ac00 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1ac10 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
1ac20 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
1ac30 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
1ac40 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
1ac50 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
1ac60 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
1ac70 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
1ac80 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
1ac90 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
1aca0 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
1acb0 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
1acc0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
1acd0 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
1ace0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
1acf0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
1ad00 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1ad10 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
1ad20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
1ad30 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
1ad40 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
1ad50 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
1ad60 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
1ad70 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1ad80 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1ad90 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
1ada0 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
1adb0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1adc0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1add0 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
1ade0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
1adf0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
1ae00 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
1ae10 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
1ae20 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
1ae30 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
1ae40 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
1ae50 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
1ae60 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
1ae70 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
1ae80 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
1ae90 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
1aea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1aeb0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1aec0 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
1aed0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
1aee0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
1aef0 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
1af00 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
1af10 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
1af20 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
1af30 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
1af40 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
1af50 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
1af60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1af70 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
1af80 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
1af90 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
1afa0 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
1afb0 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
1afc0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1afd0 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
1afe0 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
1aff0 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
1b000 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1b010 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1b020 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
1b030 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
1b040 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
1b050 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
1b060 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
1b070 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
1b080 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
1b090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b0a0 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
1b0b0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
1b0c0 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
1b0d0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
1b0e0 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
1b0f0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
1b100 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
1b110 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
1b120 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
1b130 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
1b140 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1b150 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
1b160 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
1b170 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1b180 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
1b190 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
1b1a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
1b1b0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
1b1c0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
1b1d0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
1b1e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b1f0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1b200 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
1b210 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28  pMem->n;.    if(
1b220 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28   len>0 ) memcpy(
1b230 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
1b240 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
1b250 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
1b260 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
1b270 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
1b280 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
1b290 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
1b2a0 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
1b2b0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
1b2c0 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
1b2d0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b2e0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
1b2f0 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
1b300 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
1b310 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
1b320 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
1b330 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
1b340 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
1b350 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
1b360 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
1b370 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1b380 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
1b390 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1b3a0 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
1b3b0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
1b3c0 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
1b3d0 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
1b3e0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
1b3f0 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
1b400 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
1b410 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
1b420 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1b430 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
1b440 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
1b450 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
1b460 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
1b470 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
1b480 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
1b490 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
1b4a0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1b4b0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
1b4c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b4d0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
1b4e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b4f0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1b500 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
1b510 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
1b520 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
1b530 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
1b540 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
1b550 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
1b560 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
1b570 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
1b580 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
1b590 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
1b5a0 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
1b5b0 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
1b5c0 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
1b5d0 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
1b5e0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
1b5f0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1b600 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1b610 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1b620 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1b630 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1b640 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1b650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1b660 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1b670 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1b680 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1b690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1b6a0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1b6b0 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1b6c0 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
1b6d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
1b6e0 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
1b6f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1b700 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
1b710 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
1b720 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
1b730 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b740 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
1b750 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
1b760 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
1b770 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1b780 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1b790 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
1b7a0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1b7b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b7c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
1b7d0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1b7e0 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
1b7f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b800 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
1b810 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1b820 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
1b830 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
1b840 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1b850 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
1b860 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1b870 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1b880 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1b890 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
1b8a0 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
1b8b0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
1b8c0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
1b8d0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
1b8e0 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
1b8f0 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
1b900 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1b910 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
1b920 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
1b930 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
1b940 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
1b950 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
1b960 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
1b970 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
1b980 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
1b990 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
1b9a0 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
1b9b0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
1b9c0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
1b9d0 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
1b9e0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b9f0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
1ba00 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
1ba10 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
1ba20 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
1ba30 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
1ba40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
1ba50 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
1ba60 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
1ba70 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
1ba80 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1ba90 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
1baa0 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
1bab0 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
1bac0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
1bad0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
1bae0 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
1baf0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
1bb00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
1bb10 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
1bb20 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
1bb30 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bb40 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1bb50 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1bb60 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1bb70 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1bb80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1bb90 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1bba0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1bbb0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1bbe0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1bbf0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
1bc00 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1bc10 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b  {.    case 10: {
1bc20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65   /* Internal use
1bc30 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68   only: NULL with
1bc40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1bc60 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67   UPDATE no-chang
1bc70 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20  e flag set */.  
1bc80 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1bc90 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a  = MEM_Null|MEM_Z
1bca0 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ero;.      pMem-
1bcb0 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  >n = 0;.      pM
1bcc0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b  em->u.nZero = 0;
1bcd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bce0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a    }.    case 11:
1bcf0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
1bd00 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
1bd10 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
1bd20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
1bd30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1bd40 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
1bd50 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
1bd60 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
1bd70 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
1bd80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bd90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
1bda0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
1bdb0 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
1bdc0 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
1bdd0 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
1bde0 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
1bdf0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1be00 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
1be10 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
1be20 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1be30 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1be40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1be50 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1be60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1be70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1be80 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1be90 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1bea0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1beb0 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
1bec0 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
1bed0 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
1bee0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1bef0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1bf00 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1bf10 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
1bf20 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1bf30 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1bf40 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1bf50 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1bf60 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1bf70 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
1bf80 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1bf90 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1bfa0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1bfb0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
1bfc0 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
1bfd0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
1bfe0 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
1bff0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1c000 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c010 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
1c020 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
1c030 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1c040 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1c050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c060 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1c070 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
1c080 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1c090 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1c0a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c0b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c0c0 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
1c0d0 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
1c0e0 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
1c0f0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1c100 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1c110 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c120 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1c130 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66  INT(buf);.#ifdef
1c140 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20   __HP_cc .      
1c150 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* Work around a
1c160 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20   sign-extension 
1c170 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f  bug in the HP co
1c180 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58  mpiler for HP/UX
1c190 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75   */.      if( bu
1c1a0 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d  f[0]&0x80 ) pMem
1c1b0 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66  ->u.i |= 0xfffff
1c1c0 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23  fff80000000LL;.#
1c1d0 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d  endif.      pMem
1c1e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c1f0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c200 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
1c220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c230 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1c240 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c250 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c260 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d  NCE-OF: R-50385-
1c270 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61  09674 Value is a
1c280 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62   big-endian 48-b
1c290 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c2a0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1c2b0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c2c0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1c2d0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
1c2e0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1c2f0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
1c300 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c310 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c320 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c330 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c340 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
1c350 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1c360 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
1c370 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c380 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
1c390 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
1c3a0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
1c3b0 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
1c3c0 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
1c3d0 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
1c3e0 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
1c3f0 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
1c400 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
1c410 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
1c420 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1c430 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
1c440 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
1c450 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
1c460 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
1c470 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
1c480 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
1c490 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
1c4a0 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  er 1 */.      /*
1c4b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c4c0 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75  12976-22893 Valu
1c4d0 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1c4e0 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   0. */.      /* 
1c4f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1c500 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65  8143-12121 Value
1c510 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1c520 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  1. */.      pMem
1c530 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
1c540 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
1c550 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1c560 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
1c570 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
1c580 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
1c590 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c5a0 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c  -14606-31564 Val
1c5b0 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61  ue is a BLOB tha
1c5c0 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79  t is (N-12)/2 by
1c5d0 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  tes in.      ** 
1c5e0 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a  length..      **
1c5f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c600 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75  28401-00140 Valu
1c610 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e  e is a string in
1c620 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
1c630 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ng and.      ** 
1c640 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69  (N-13)/2 bytes i
1c650 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20  n length. */.   
1c660 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1c670 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
1c680 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
1c690 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
1c6a0 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
1c6b0 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
1c6c0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
1c6d0 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
1c6e0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
1c6f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
1c700 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
1c710 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
1c720 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
1c730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1c740 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
1c750 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
1c760 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
1c770 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
1c780 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
1c790 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
1c7a0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
1c7b0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
1c7c0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1c7d0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
1c7e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1c7f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
1c800 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
1c810 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
1c820 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
1c830 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
1c840 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
1c850 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
1c860 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
1c870 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
1c880 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
1c890 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
1c8a0 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
1c8b0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
1c8c0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
1c8d0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
1c8e0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
1c8f0 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
1c900 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
1c910 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
1c920 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1c930 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
1c940 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
1c950 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
1c960 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
1c970 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
1c980 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1c990 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
1c9a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c9b0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1c9c0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
1c9d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
1c9e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
1c9f0 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1ca00 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
1ca10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca30 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1ca40 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29   the record */.)
1ca50 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1ca60 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1ca70 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1ca80 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1ca90 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1cac0 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
1cad0 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42  d for *p */.  nB
1cae0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
1caf0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1cb00 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
1cb10 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  m)*(pKeyInfo->nK
1cb20 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20  eyField+1);.  p 
1cb30 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1cb40 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1cb50 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1cb60 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
1cb70 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
1cb80 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ;.  p->aMem = (M
1cb90 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1cba0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1cbb0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1cbc0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1cbd0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1cbe0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1cbf0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1cc00 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1cc10 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1cc20 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1cc30 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1cc40 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1cc50 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1cc60 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1cc70 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1cc80 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1cc90 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1cca0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1ccb0 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1ccc0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1ccd0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1cce0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1ccf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1cd00 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1cd10 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1cd20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1cd30 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1cd40 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1cd50 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1cd60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cd70 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1cd80 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1cd90 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1cda0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1cdb0 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1cdc0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1cdd0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1cde0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1cdf0 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1ce00 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1ce10 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1ce20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1ce30 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1ce40 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1ce50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ce60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ce70 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1ce80 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1ce90 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ceb0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1cec0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1ced0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1cee0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1cef0 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1cf00 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1cf10 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1cf20 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1cf30 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1cf40 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1cf50 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1cf60 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1cf70 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1cf80 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1cf90 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1cfa0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1cfb0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1cfc0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1cfd0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1cfe0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1cff0 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1d000 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1d010 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1d020 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1d030 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1d040 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1d050 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1d060 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1d070 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1d080 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1d090 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1d0a0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1d0b0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1d0c0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1d0d0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1d0e0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1d0f0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1d100 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29  >nKeyField + 1 )
1d110 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1d120 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  u;.}..#ifdef SQL
1d130 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1d140 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1d150 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
1d160 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
1d170 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
1d180 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
1d190 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d1a0 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
1d1b0 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
1d1c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
1d1d0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1d1e0 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
1d1f0 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
1d200 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
1d210 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d220 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
1d230 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
1d240 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
1d250 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
1d260 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
1d270 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1d280 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
1d290 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
1d2a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1d2b0 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
1d2c0 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
1d2d0 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
1d2e0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1d2f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
1d300 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
1d310 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
1d320 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
1d330 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
1d340 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
1d350 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1d360 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1d370 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
1d380 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1d390 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1d3a0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
1d3b0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1d3c0 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
1d3d0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1d3e0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1d400 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
1d410 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1d420 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1d430 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1d440 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1d450 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
1d460 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
1d470 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1d480 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
1d490 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1d4a0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1d4b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d4c0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
1d4d0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1d4e0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
1d4f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1d500 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1d510 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d520 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
1d530 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
1d540 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
1d550 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1d560 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
1d570 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
1d580 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1d590 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1d5a0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
1d5b0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1d5c0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
1d5d0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
1d5e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
1d5f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d600 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
1d610 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1d620 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1d630 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1d640 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1d650 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
1d660 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
1d670 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
1d680 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
1d690 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1d6a0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
1d6b0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
1d6c0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
1d6d0 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
1d6e0 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
1d6f0 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
1d700 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
1d710 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
1d720 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
1d730 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
1d740 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
1d750 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
1d760 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
1d770 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
1d780 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
1d790 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
1d7a0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
1d7b0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
1d7c0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
1d7d0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
1d7e0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1d7f0 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
1d800 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
1d810 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
1d820 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
1d830 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
1d840 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
1d850 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1d860 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
1d870 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1d880 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69  y1, szHdr1);.  i
1d890 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20  f( szHdr1>98307 
1d8a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d8b0 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20  CORRUPT;.  d1 = 
1d8c0 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
1d8d0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ( pKeyInfo->nAll
1d8e0 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1d8f0 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54  Field || CORRUPT
1d900 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1d910 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1d920 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1d930 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1d940 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
1d950 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1d960 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1d970 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1d980 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1d990 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
1d9a0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
1d9b0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
1d9c0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
1d9d0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
1d9e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
1d9f0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
1da00 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
1da10 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1da20 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
1da30 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
1da40 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
1da50 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
1da60 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
1da70 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
1da80 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
1da90 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
1daa0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
1dab0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1dac0 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
1dad0 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
1dae0 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
1daf0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
1db00 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
1db10 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
1db20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
1db30 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1db40 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
1db50 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1db60 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74   if( d1+serial_t
1db70 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79  ype1+2>(u32)nKey
1db80 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c  1.     && d1+sql
1db90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1dba0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1dbb0 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a  e1)>(u32)nKey1 .
1dbc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1dbd0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1dbe0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1dbf0 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
1dc00 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1dc10 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1dc20 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1dc30 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1dc40 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
1dc50 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
1dc60 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
1dc70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
1dc80 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
1dc90 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
1dca0 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1dcb0 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  l[i]);.    if( r
1dcc0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
1dcd0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1dce0 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1dcf0 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1dd00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
1dd10 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1dd20 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1dd30 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
1dd40 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
1dd50 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
1dd60 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
1dd70 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
1dd80 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
1dd90 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
1dda0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
1ddb0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1ddc0 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
1ddd0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1dde0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1ddf0 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1de00 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1de10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1de20 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1de30 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1de40 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1de50 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1de60 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1de70 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1de80 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1de90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1dea0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1deb0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1dec0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1ded0 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
1dee0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1def0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1df00 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1df10 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1df20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1df30 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1df40 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
1df50 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
1df60 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
1df70 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
1df80 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
1df90 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
1dfa0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1dfb0 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
1dfc0 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
1dfd0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1dfe0 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
1dff0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1e000 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1e010 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
1e020 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1e030 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1e040 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1e050 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1e060 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1e070 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1e080 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1e090 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1e0a0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1e0b0 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1e0c0 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1e0d0 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1e0e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1e0f0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1e100 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1e110 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1e120 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1e130 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1e140 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1e150 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e160 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1e170 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1e180 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1e190 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1e1a0 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1e1b0 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1e1c0 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1e1d0 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1e1e0 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1e1f0 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1e200 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b  t the KeyInfo.nK
1e210 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e  eyField or KeyIn
1e220 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c  fo.nAllField val
1e230 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  ues were compute
1e240 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79  d.** incorrectly
1e250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e260 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1e270 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1e280 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  s(.  int nKey, c
1e290 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1e2a0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
1e2b0 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20   to verify */ . 
1e2c0 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a   const KeyInfo *
1e2d0 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f  pKeyInfo       /
1e2e0 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77  * Compare size w
1e2f0 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f  ith this KeyInfo
1e300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69   */.){.  int nFi
1e310 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73  eld = 0;.  u32 s
1e320 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b  zHdr;.  u32 idx;
1e330 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a  .  u32 notUsed;.
1e340 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1e350 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1e360 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e370 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28  ar*)pKey;..  if(
1e380 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1e390 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65  turn;.  idx = ge
1e3a0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1e3b0 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74  szHdr);.  assert
1e3c0 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  ( nKey>=0 );.  a
1e3d0 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75  ssert( szHdr<=(u
1e3e0 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69  32)nKey );.  whi
1e3f0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b  le( idx<szHdr ){
1e400 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1e410 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78  arint32(aKey+idx
1e420 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20  , notUsed);.    
1e430 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20  nField++;.  }.  
1e440 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c  assert( nField <
1e450 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  = pKeyInfo->nAll
1e460 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1e470 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1e480 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1e490 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1e4a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1e4b0 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1e4c0 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1e4d0 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1e4e0 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1e4f0 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1e500 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1e510 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1e520 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1e530 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1e540 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1e550 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1e560 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1e570 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1e580 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1e590 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1e5a0 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1e5b0 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1e5c0 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1e5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1e5e0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1e5f0 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1e600 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1e610 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1e620 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1e630 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1e640 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1e650 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1e660 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1e670 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1e680 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1e690 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1e6a0 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1e6b0 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1e6c0 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1e6d0 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1e6e0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1e6f0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1e700 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1e710 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1e720 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1e730 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1e740 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1e750 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1e760 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1e770 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1e780 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20  1, *v2;.    Mem 
1e790 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1e7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1e7b0 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1e7c0 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1e7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e7e0 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1e7f0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1e800 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1e810 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1e820 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1e830 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1e840 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1e850 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1e860 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1e870 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1e880 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1e890 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1e8a0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1e8b0 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v2 = sqlite3Valu
1e8c0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1e8d0 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c  alue*)&c2, pColl
1e8e0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  ->enc);.    if( 
1e8f0 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1e900 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
1e910 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1e920 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1e930 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  PT;.      rc = 0
1e940 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e950 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1e960 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1e970 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e  , c1.n, v1, c2.n
1e980 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , v2);.    }.   
1e990 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e9a0 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1e9b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e9c0 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1e9d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1e9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1e9f0 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1ea00 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1ea10 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1ea20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1ea30 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1ea40 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1ea50 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1ea60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ea70 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1ea80 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1ea90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1eaa0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1eab0 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1eac0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1ead0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1eae0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1eaf0 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1eb00 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1eb10 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1eb20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1eb30 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1eb40 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1eb50 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1eb60 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1eb70 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1eb80 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1eb90 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1eba0 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1ebb0 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f  or..*/.SQLITE_NO
1ebc0 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1ebd0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1ebe0 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1ebf0 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1ec00 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31   int c;.  int n1
1ec10 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74   = pB1->n;.  int
1ec20 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20   n2 = pB2->n;.. 
1ec30 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
1ec40 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f  le to have a Blo
1ec50 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73  b value that has
1ec60 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63   some non-zero c
1ec70 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c  ontent.  ** foll
1ec80 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e  owed by zero con
1ec90 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20  tent.  But that 
1eca0 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f  only comes up fo
1ecb0 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20  r Blobs formed. 
1ecc0 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61   ** by the OP_Ma
1ecd0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c  keRecord opcode,
1ece0 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20   and such Blobs 
1ecf0 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64  never get passed
1ed00 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1ed10 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20  e3MemCompare(). 
1ed20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  */.  assert( (pB
1ed30 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1ed40 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30  ero)==0 || n1==0
1ed50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1ed60 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1ed70 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d  Zero)==0 || n2==
1ed80 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31  0 );..  if( (pB1
1ed90 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61  ->flags|pB2->fla
1eda0 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  gs) & MEM_Zero )
1edb0 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66  {.    if( pB1->f
1edc0 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67  lags & pB2->flag
1edd0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
1ede0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1edf0 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d  ->u.nZero - pB2-
1ee00 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65  >u.nZero;.    }e
1ee10 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61  lse if( pB1->fla
1ee20 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1ee30 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1ee40 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42  lZero(pB2->z, pB
1ee50 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d  2->n) ) return -
1ee60 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1ee70 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e  pB1->u.nZero - n
1ee80 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1ee90 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1eea0 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e  ro(pB1->z, pB1->
1eeb0 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  n) ) return +1;.
1eec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20        return n1 
1eed0 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1eee0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20      }.  }.  c = 
1eef0 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70  memcmp(pB1->z, p
1ef00 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e  B2->z, n1>n2 ? n
1ef10 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63  2 : n1);.  if( c
1ef20 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72   ) return c;.  r
1ef30 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d  eturn n1 - n2;.}
1ef40 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d  ../*.** Do a com
1ef50 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20  parison between 
1ef60 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  a 64-bit signed 
1ef70 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34  integer and a 64
1ef80 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  -bit floating-po
1ef90 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20  int.** number.  
1efa0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1efb0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1efc0 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
1efd0 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68  (i64) is less th
1efe0 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  an,.** equal to,
1eff0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1f000 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75   the second (dou
1f010 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
1f020 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  int sqlite3IntFl
1f030 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69  oatCompare(i64 i
1f040 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69  , double r){.  i
1f050 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f  f( sizeof(LONGDO
1f060 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a  UBLE_TYPE)>8 ){.
1f070 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
1f080 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55  YPE x = (LONGDOU
1f090 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20  BLE_TYPE)i;.    
1f0a0 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e  if( x<r ) return
1f0b0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72   -1;.    if( x>r
1f0c0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1f0d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1f0e0 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a  lse{.    i64 y;.
1f0f0 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20      double s;.  
1f100 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32    if( r<-9223372
1f110 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1f120 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f130 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33  if( r>=922337203
1f140 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1f150 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1f160 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1f170 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1f180 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1f190 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f1a0 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20  s = (double)i;. 
1f1b0 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74     if( s<r ) ret
1f1c0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1f1d0 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  s>r ) return +1;
1f1e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1f1f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
1f200 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63  are the values c
1f210 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  ontained by the 
1f220 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  two memory cells
1f230 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e  , returning.** n
1f240 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
1f250 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65   positive if pMe
1f260 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1f270 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1f280 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d  eater.** than pM
1f290 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64  em2. Sorting ord
1f2a0 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72  er is NULL's fir
1f2b0 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  st, followed by 
1f2c0 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72  numbers (integer
1f2d0 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20  s.** and reals) 
1f2e0 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c  sorted numerical
1f2f0 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ly, followed by 
1f300 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20  text ordered by 
1f310 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  the collating.**
1f320 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
1f330 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  and finally blob
1f340 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
1f350 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
1f360 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1f370 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1f380 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
1f390 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1f3a0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f  te3MemCompare(co
1f3b0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20  nst Mem *pMem1, 
1f3c0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1f3d0 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  , const CollSeq 
1f3e0 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66  *pColl){.  int f
1f3f0 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
1f400 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
1f410 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
1f420 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
1f430 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
1f440 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
1f450 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
1f460 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
1f470 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73  Set(pMem1) && !s
1f480 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1f490 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a  owSet(pMem2) );.
1f4a0 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
1f4b0 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
1f4c0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1f4d0 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
1f4e0 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
1f4f0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
1f500 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1f510 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
1f520 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
1f530 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
1f540 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
1f550 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61    }..  /* At lea
1f560 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  st one of the tw
1f570 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75  o values is a nu
1f580 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mber.  */.  if( 
1f590 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1f5a0 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1f5b0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  ) ){.    if( (f1
1f5c0 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1f5d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1f5e0 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1f5f0 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1f600 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1f610 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1f620 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1f630 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1f640 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1f650 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1f660 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1f670 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1f680 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r < pMem2->u.r 
1f690 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1f6a0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1f6b0 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r > pMem2->u.r )
1f6c0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f6d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1f6e0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1f6f0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1f700 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
1f710 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1f720 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1f730 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f740 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem1->u.i, pMe
1f750 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m2->u.r);.      
1f760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f770 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1f780 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f790 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
1f7a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1f7b0 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1f7c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f7d0 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1f7e0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75  Compare(pMem2->u
1f7f0 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b  .i, pMem1->u.r);
1f800 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f810 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1f820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f830 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
1f840 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
1f850 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1f860 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
1f870 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
1f880 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
1f890 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
1f8a0 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
1f8b0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1f8c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
1f8d0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1f8e0 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
1f8f0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1f900 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1f910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1f920 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1f930 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
1f940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f950 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1f960 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1f970 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c  nc==pMem2->enc |
1f980 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c  | pMem1->db->mal
1f990 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1f9a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1f9b0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1f9c0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1f9d0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1f9e0 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1f9f0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1fa00 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1fa10 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1fa20 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1fa30 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1fa40 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1fa50 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1fa60 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1fa70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1fa80 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1fa90 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1faa0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1fab0 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1fac0 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1fad0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1fae0 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1faf0 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1fb00 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1fb10 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1fb20 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1fb30 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1fb40 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1fb50 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1fb60 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1fb70 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1fb80 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1fb90 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1fba0 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1fbb0 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1fbc0 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1fbd0 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1fbe0 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1fbf0 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1fc00 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1fc10 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1fc20 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1fc30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1fc40 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1fc50 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1fc60 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1fc70 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1fc80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1fc90 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1fca0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1fcb0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1fcc0 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1fcd0 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1fce0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1fcf0 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1fd00 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1fd10 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1fd20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1fd30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1fd40 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1fd50 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1fd60 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1fd70 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1fd80 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1fd90 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1fda0 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1fdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1fdc0 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1fdd0 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1fde0 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1fdf0 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1fe00 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1fe10 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1fe20 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1fe30 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1fe40 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1fe50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fe60 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1fe70 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1fe80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe90 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1fea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1feb0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1fec0 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1fed0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1fee0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1fef0 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1ff00 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1ff10 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1ff20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1ff30 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1ff40 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1ff50 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1ff60 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1ff70 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1ff80 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1ff90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ffa0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1ffb0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1ffc0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1ffd0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1ffe0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1fff0 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
20000 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
20010 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
20020 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
20030 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20040 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
20050 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
20060 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
20070 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
20080 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
20090 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
200a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
200b0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
200c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
200d0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
200e0 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
200f0 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
20100 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
20110 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
20120 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
20130 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
20140 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
20150 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
20160 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
20170 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
20180 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
20190 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
201a0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
201b0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
201c0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
201d0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
201e0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
201f0 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
20200 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
20210 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
20220 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
20230 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
20240 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
20250 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
20260 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
20270 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
20280 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
20290 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
202a0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
202b0 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
202c0 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
202d0 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
202e0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
202f0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
20300 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
20310 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
20320 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
20330 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
20340 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
20350 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
20360 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
20370 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
20380 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
20390 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
203a0 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
203b0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
203c0 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
203d0 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
203e0 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
203f0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
20400 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
20410 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
20420 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
20430 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
20440 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
20450 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
20460 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
20470 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
20480 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
20490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
204a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
204b0 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
204c0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
204d0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
204e0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
204f0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
20500 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
20510 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
20520 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20540 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
20550 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
20560 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
20590 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
205a0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
205b0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
205e0 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
205f0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
20600 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20620 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
20630 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
20640 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
20670 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
20680 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
20690 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
206a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
206b0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
206c0 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
206d0 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
206e0 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
206f0 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
20700 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
20710 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  *pKeyInfo;.  con
20720 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
20730 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
20740 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20750 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
20760 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
20770 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
20780 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
20790 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
207a0 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
207b0 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
207c0 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
207d0 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
207e0 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
207f0 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
20800 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
20810 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
20820 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
20830 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
20840 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
20850 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
20860 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
20870 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
20880 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
20890 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
208a0 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
208b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
208c0 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
208d0 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
208e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
208f0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
20900 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
20910 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
20920 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
20930 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
20940 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
20950 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
20960 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20970 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
20980 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
20990 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
209a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
209b0 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
209c0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
209d0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
209e0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
209f0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
20a00 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
20a10 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65  >nAllField>=pPKe
20a20 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20  y2->nField .    
20a30 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
20a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20a50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20a60 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
20a70 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
20a80 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  2->pKeyInfo->nKe
20a90 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
20aa0 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
20ab0 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
20ac0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
20ad0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
20ae0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e      /* RHS is an
20af0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20b00 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
20b10 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
20b20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
20b30 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
20b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
20b50 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
20b60 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
20b70 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
20b80 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
20b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
20ba0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
20bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
20bc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20bd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
20be0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20bf0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
20c00 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
20c10 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
20c20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  ;.        rc = -
20c30 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
20c40 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69  ompare(pRhs->u.i
20c50 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20  , mem1.u.r);.   
20c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20c70 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65    i64 lhs = vdbe
20c80 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
20c90 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b  serial_type, &aK
20ca0 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20  ey1[d1]);.      
20cb0 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73    i64 rhs = pRhs
20cc0 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69  ->u.i;.        i
20cd0 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
20ce0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
20cf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20d00 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
20d10 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
20d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20d30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20d40 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a   RHS is real */.
20d50 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
20d60 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  s->flags & MEM_R
20d70 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72  eal ){.      ser
20d80 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
20d90 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
20da0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
20db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
20dc0 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20  Serial types 12 
20dd0 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73  or greater are s
20de0 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
20df0 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20   (greater than. 
20e00 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
20e10 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64  s). Types 10 and
20e20 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c   11 are currentl
20e30 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20  y "reserved for 
20e40 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20  future .        
20e50 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64  ** use", so it d
20e60 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61  oesn't really ma
20e70 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65  tter what the re
20e80 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
20e90 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
20ea0 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76  em to numberic v
20eb0 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20  alues are.  */. 
20ec0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
20ed0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20ee0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
20ef0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
20f00 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20f20 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
20f30 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
20f40 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
20f50 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
20f60 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
20f70 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
20f80 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r<pRhs->u.r ){.
20f90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20fa0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
20fb0 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e  else if( mem1.u.
20fc0 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20  r>pRhs->u.r ){. 
20fd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20fe0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +1;.          }.
20ff0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21000 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21010 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
21020 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70  pare(mem1.u.i, p
21030 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Rhs->u.r);.     
21040 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21050 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
21060 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  s a string */.  
21070 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
21080 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
21090 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
210a0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
210b0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
210c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
210d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
210e0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
210f0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
21100 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
21110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21120 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
21130 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
21140 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
21150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21160 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61   mem1.n = (seria
21170 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
21180 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21190 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d  se( (d1+mem1.n)=
211a0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
211b0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
211c0 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
211d0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
211e0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
211f0 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20  if( (d1+mem1.n) 
21200 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
21210 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
21220 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
21230 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
21240 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
21250 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21270 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
21280 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21290 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  (pKeyInfo = pPKe
212a0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 61  y2->pKeyInfo)->a
212b0 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
212c0 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20       mem1.enc = 
212d0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
212e0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62           mem1.db
212f0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
21300 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
21310 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b  flags = MEM_Str;
21320 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
21330 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79  z = (char*)&aKey
21340 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  1[d1];.         
21350 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72   rc = vdbeCompar
21360 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20  eMemString(.    
21370 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c            &mem1,
21380 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d   pRhs, pKeyInfo-
21390 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65  >aColl[i], &pPKe
213a0 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  y2->errCode.    
213b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
213c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
213d0 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
213e0 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e  (mem1.n, pRhs->n
213f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
21400 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
21410 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
21420 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
21430 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
21440 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e  mem1.n - pRhs->n
21450 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
21460 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21470 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62  /* RHS is a blob
21480 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
21490 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
214a0 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
214b0 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e   assert( (pRhs->
214c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
214d0 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d  )==0 || pRhs->n=
214e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56  =0 );.      getV
214f0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
21500 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
21510 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
21520 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
21530 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
21540 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
21550 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
21560 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
21570 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
21580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21590 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
215a0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
215b0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
215c0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
215d0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
215e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
215f0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
21600 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
21610 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
21620 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
21630 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
21640 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
21650 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
21660 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
21670 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
21680 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21690 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
216a0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
216b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73    }else if( pRhs
216c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
216d0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
216e0 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28  if( !isAllZero((
216f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65  const char*)&aKe
21700 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a  y1[d1],nStr) ){.
21710 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21720 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   1;.          }e
21730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21740 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
21750 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  s->u.nZero;.    
21760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21780 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
21790 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
217a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
217b0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
217c0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
217d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
217e0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
217f0 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
21800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21810 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
21820 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
21830 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
21840 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
21850 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
21860 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
21870 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
21880 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
21890 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b    if( pPKey2->pK
218a0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
218b0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
218c0 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
218d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
218e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
218f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
21900 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
21910 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
21920 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
21930 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
21940 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
21950 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
21970 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65  .    if( i==pPKe
21980 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  y2->nField ) bre
21990 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a  ak;.    pRhs++;.
219a0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
219b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
219c0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
219d0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c  .    idx1 += sql
219e0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65  ite3VarintLen(se
219f0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77  rial_type);.  }w
21a00 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69  hile( idx1<(unsi
21a10 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 64  gned)szHdr1 && d
21a20 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
21a30 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
21a40 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
21a50 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
21a60 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
21a70 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
21a80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
21a90 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
21aa0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
21ab0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
21ac0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
21ad0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
21ae0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
21af0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
21b00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
21b10 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
21b20 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
21b30 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
21b40 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
21b50 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
21b60 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
21b70 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
21b80 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
21b90 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
21ba0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
21bb0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
21bc0 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
21bd0 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
21be0 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
21bf0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
21c00 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
21c10 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
21c20 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  c) .       || pP
21c30 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
21c40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21c50 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e  .  );.  pPKey2->
21c60 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65  eqSeen = 1;.  re
21c70 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
21c80 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
21c90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21ca0 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
21cb0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
21cc0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
21cd0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
21ce0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
21cf0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
21d00 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
21d10 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
21d20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21d30 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
21d40 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
21d50 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
21d60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
21d70 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
21d80 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
21d90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
21da0 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
21db0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
21dc0 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
21dd0 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
21de0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
21df0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
21e00 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
21e10 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
21e20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
21e30 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
21e40 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
21e50 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
21e60 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
21e70 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
21e80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
21e90 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
21ea0 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
21eb0 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
21ec0 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
21ed0 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
21ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
21ef0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
21f00 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
21f10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
21f20 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
21f30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21f40 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
21f50 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
21f60 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
21f70 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
21f80 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
21f90 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
21fa0 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
21fb0 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
21fc0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
21fd0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
21fe0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
21ff0 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73  i64 v;.  i64 lhs
22000 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
22010 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
22020 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
22030 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
22040 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
22050 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
22060 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
22070 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
22080 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
22090 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
220a0 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
220b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
220c0 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
220d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
220e0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
220f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22100 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
22110 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
22120 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
22130 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
22140 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
22150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
22160 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
22170 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22180 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
22190 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
221a0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
221b0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
221c0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
221d0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
221e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
221f0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
22200 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
22210 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22220 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
22230 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
22240 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
22250 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
22260 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
22270 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
22290 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
222a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
222b0 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
222c0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
222d0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
222e0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
222f0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
22300 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
22310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22320 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
22330 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
22340 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22350 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
22360 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
22370 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
22380 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
22390 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
223a0 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
223b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
223c0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
223d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
223e0 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
223f0 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
22400 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
22410 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
22420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
22430 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
22440 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
22450 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
22460 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
22470 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
22480 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
22490 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
224a0 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
224b0 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
224c0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
224d0 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
224e0 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
224f0 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
22500 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
22510 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
22520 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
22530 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
22540 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
22550 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
22560 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
22570 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
22580 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
22590 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
225a0 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
225b0 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
225c0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
225d0 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
225e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
225f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22600 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22610 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
22620 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
22630 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22640 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
22650 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
22660 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65  .  }..  v = pPKe
22670 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
22680 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
22690 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
226a0 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
226b0 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
226c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
226d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
226e0 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
226f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
22700 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
22710 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
22720 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
22730 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
22740 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
22750 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
22760 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
22770 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
22780 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
22790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
227a0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
227b0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
227c0 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
227d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
227e0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
227f0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
22800 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
22810 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
22820 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
22830 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
22840 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
22850 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
22860 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
22870 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
22880 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22890 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
228a0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
228b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
228c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
228d0 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
228e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
228f0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
22900 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
22910 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
22920 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
22930 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
22940 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
22950 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
22960 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
22970 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
22980 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
22990 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
229a0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
229b0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
229c0 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
229d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
229e0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
229f0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
22a00 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
22a10 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
22a20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22a30 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
22a40 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
22a50 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
22a60 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
22a70 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
22a80 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
22a90 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
22aa0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
22ab0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
22ac0 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
22ad0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
22ae0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
22af0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
22b00 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
22b10 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
22b20 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
22b30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
22b40 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
22b50 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
22b60 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
22b70 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
22b80 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
22b90 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
22ba0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
22bb0 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
22bc0 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
22bd0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
22be0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
22bf0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
22c00 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
22c10 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
22c20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
22c30 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
22c40 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
22c50 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
22c60 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
22c70 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
22c80 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
22c90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22ca0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
22cb0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
22cc0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
22cd0 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
22ce0 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
22cf0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
22d00 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
22d10 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
22d20 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
22d30 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
22d40 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
22d50 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
22d60 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
22d70 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
22d80 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
22d90 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
22da0 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
22db0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
22dc0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
22dd0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
22de0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
22df0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
22e00 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
22e10 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
22e20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
22e30 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
22e40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22e50 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
22e60 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22e70 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
22e80 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
22e90 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
22ea0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
22eb0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
22ec0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
22ed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22ee0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22ef0 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
22f00 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
22f10 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
22f20 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22f30 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
22f40 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
22f50 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
22f60 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
22f70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
22f80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
22f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22fa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
22fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22fc0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
22fd0 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
22fe0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
22ff0 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
23000 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
23010 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
23020 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
23030 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
23040 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
23050 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
23060 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
23070 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
23080 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
23090 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
230a0 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
230b0 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
230c0 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
230d0 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
230e0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
230f0 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
23100 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
23110 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
23120 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
23130 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
23140 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
23150 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
23160 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
23170 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
23180 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
23190 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
231a0 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
231b0 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
231c0 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
231d0 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
231e0 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
231f0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
23200 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
23210 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
23220 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
23230 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
23240 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
23250 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
23260 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
23270 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
23280 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
23290 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
232a0 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
232b0 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
232c0 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
232d0 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
232e0 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
232f0 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
23300 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
23310 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
23320 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
23330 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
23340 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
23350 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
23360 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
23370 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
23380 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
23390 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
233a0 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
233b0 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  s.  */.  if( p->
233c0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
233d0 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  eld<=13 ){.    i
233e0 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
233f0 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
23400 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
23410 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
23420 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
23430 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
23440 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
23450 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
23460 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
23470 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
23480 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
23490 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
234a0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
234b0 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
234c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
234d0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
234e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
234f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
23500 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
23510 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
23520 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
23530 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
23540 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
23550 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
23560 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
23570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
23580 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
23590 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
235a0 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
235b0 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
235c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
235d0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
235e0 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
235f0 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
23600 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
23610 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
23620 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
23630 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
23640 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
23650 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
23660 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
23670 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
23680 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
23690 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
236a0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
236b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
236c0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
236d0 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
236e0 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
236f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
23700 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
23710 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
23720 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
23730 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
23740 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
23750 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
23760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
23770 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
23780 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
23790 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
237a0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
237b0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
237c0 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
237d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
237e0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
237f0 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
23800 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
23810 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
23820 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
23830 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
23840 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
23850 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
23860 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
23870 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
23880 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
23890 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
238a0 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
238b0 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
238c0 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
238d0 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
238e0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
238f0 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
23900 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
23910 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
23920 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
23930 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
23940 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
23950 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
23960 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
23970 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
23980 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23990 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
239a0 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
239b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
239c0 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
239d0 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
239e0 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
239f0 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
23a00 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
23a10 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
23a20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
23a30 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
23a40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
23a50 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
23a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
23a70 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
23a80 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
23a90 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
23aa0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
23ab0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
23ac0 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
23ad0 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
23ae0 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
23af0 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
23b00 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
23b10 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
23b20 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
23b30 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
23b40 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 74 65 73 74  r==m.n );.  test
23b50 63 61 73 65 28 20 73 7a 48 64 72 3e 30 78 37 66  case( szHdr>0x7f
23b60 66 66 66 66 66 66 20 29 3b 0a 20 20 61 73 73 65  ffffff );.  asse
23b70 72 74 28 20 6d 2e 6e 3e 3d 30 20 29 3b 0a 20 20  rt( m.n>=0 );.  
23b80 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
23b90 64 72 3c 33 20 7c 7c 20 73 7a 48 64 72 3e 28 75  dr<3 || szHdr>(u
23ba0 6e 73 69 67 6e 65 64 29 6d 2e 6e 29 20 29 7b 0a  nsigned)m.n) ){.
23bb0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
23bc0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
23bd0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
23be0 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
23bf0 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
23c00 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
23c10 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
23c20 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
23c30 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
23c40 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
23c50 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
23c60 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
23c70 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
23c80 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
23c90 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
23ca0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
23cb0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
23cc0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
23cd0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
23ce0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
23cf0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23d00 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
23d10 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
23d20 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
23d30 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
23d40 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
23d50 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
23d60 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
23d70 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
23d80 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
23d90 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
23da0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
23db0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
23dc0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
23dd0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
23de0 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69  peSizes[typeRowi
23df0 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d];.  testcase( 
23e00 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
23e10 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
23e20 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
23e30 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
23e40 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
23e50 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
23e60 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
23e70 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
23e80 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
23e90 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
23ea0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
23eb0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
23ec0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
23ed0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
23ee0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
23ef0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
23f00 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
23f10 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
23f20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
23f30 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
23f40 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
23f50 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
23f60 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
23f70 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
23f80 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
23f90 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
23fa0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
23fb0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
23fc0 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
23fd0 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
23fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
23ff0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
24000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24010 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
24020 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
24030 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
24040 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
24050 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
24060 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
24070 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
24080 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
24090 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
240a0 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
240b0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
240c0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
240d0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
240e0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
240f0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
24100 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
24110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24120 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
24130 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
24140 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
24150 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
24160 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
24170 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
24180 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
24190 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
241a0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
241b0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
241c0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
241d0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
241e0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
241f0 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
24200 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
24210 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
24220 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
24230 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
24240 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
24250 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
24260 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
24270 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
24280 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
24290 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
242a0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
242b0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
242c0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
242d0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
242e0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
242f0 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
24300 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
24310 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
24320 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
24330 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
24340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24350 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
24360 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
24370 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
24380 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
24390 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
243a0 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  pCur;.  Mem m;..
243b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
243c0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
243d0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20  BTREE );.  pCur 
243e0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
243f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24400 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24410 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
24420 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   nCellKey = sqli
24430 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
24440 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20  ize(pCur);.  /* 
24450 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
24460 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
24470 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
24480 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
24490 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
244a0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
244b0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
244c0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
244d0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
244e0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
244f0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
24500 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
24510 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
24520 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24530 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  T_BKPT;.  }.  sq
24540 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
24550 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
24560 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
24570 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
24580 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
24590 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72  ey, &m);.  if( r
245a0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
245b0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
245c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
245d0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
245e0 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  p(m.n, m.z, pUnp
245f0 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c  acked, 0);.  sql
24600 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
24610 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
24620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24630 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24640 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
24650 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
24660 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
24670 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
24680 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
24690 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
246a0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
246b0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
246c0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
246d0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
246e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
246f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24700 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
24710 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
24720 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
24730 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
24740 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
24750 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
24760 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
24770 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
24780 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
24790 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
247a0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
247b0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
247c0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
247d0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
247e0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
247f0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
24800 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
24810 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
24820 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24830 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
24840 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
24850 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
24860 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
24870 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
24880 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
24890 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
248a0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
248b0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
248c0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
248d0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
248e0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
248f0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
24900 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
24910 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
24920 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
24930 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
24940 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
24950 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
24960 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
24970 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
24980 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  solete..**.** If
24990 20 69 43 6f 64 65 20 69 73 20 31 2c 20 74 68 65   iCode is 1, the
249a0 6e 20 65 78 70 69 72 61 74 69 6f 6e 20 69 73 20  n expiration is 
249b0 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20 73  advisory.  The s
249c0 74 61 74 65 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  tatement should.
249d0 2a 2a 20 62 65 20 72 65 70 72 65 70 61 72 65 64  ** be reprepared
249e0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
249f0 73 74 61 72 74 65 64 2c 20 62 75 74 20 69 66 20  started, but if 
24a00 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 72 75  it is already ru
24a10 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20 69 73 20 61  nning.** it is a
24a20 6c 6c 6f 77 65 64 20 74 6f 20 72 75 6e 20 74 6f  llowed to run to
24a30 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2a 0a   completion..**.
24a40 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 74  ** Internally, t
24a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
24a60 74 20 73 65 74 73 20 74 68 65 20 56 64 62 65 2e  t sets the Vdbe.
24a70 65 78 70 69 72 65 64 20 66 6c 61 67 20 6f 6e 20  expired flag on 
24a80 61 6c 6c 0a 2a 2a 20 70 72 65 70 61 72 65 64 20  all.** prepared 
24a90 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
24aa0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
24ab0 31 20 66 6f 72 20 61 6e 20 69 6d 6d 65 64 69 61  1 for an immedia
24ac0 74 65 20 65 78 70 69 72 61 74 69 6f 6e 0a 2a 2a  te expiration.**
24ad0 20 61 6e 64 20 73 65 74 20 74 6f 20 32 20 66 6f   and set to 2 fo
24ae0 72 20 61 6e 20 61 64 76 69 73 6f 72 79 20 65 78  r an advisory ex
24af0 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  piration..*/.voi
24b00 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
24b10 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
24b20 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
24b30 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 56 64 62  nt iCode){.  Vdb
24b40 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
24b50 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
24b60 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
24b70 2d 3e 65 78 70 69 72 65 64 20 3d 20 69 43 6f 64  ->expired = iCod
24b80 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e+1;.  }.}../*.*
24b90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
24ba0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
24bb0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
24bc0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
24bd0 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
24be0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
24bf0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
24c00 75 72 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 50  urn the SQLITE_P
24c10 52 45 50 41 52 45 20 66 6c 61 67 73 20 66 6f 72  REPARE flags for
24c20 20 61 20 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73   a Vdbe..*/.u8 s
24c30 71 6c 69 74 65 33 56 64 62 65 50 72 65 70 61 72  qlite3VdbePrepar
24c40 65 46 6c 61 67 73 28 56 64 62 65 20 2a 76 29 7b  eFlags(Vdbe *v){
24c50 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 70 72 65  .  return v->pre
24c60 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pFlags;.}../*.**
24c70 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24c80 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
24c90 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
24ca0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
24cb0 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
24cc0 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
24cd0 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
24ce0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
24cf0 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
24d00 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
24d10 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
24d20 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
24d30 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
24d40 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
24d50 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
24d60 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
24d70 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
24d80 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
24d90 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
24da0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
24db0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
24dc0 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
24dd0 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
24de0 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
24df0 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
24e00 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
24e10 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
24e20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
24e30 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
24e40 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
24e50 61 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  ar-1];.    asser
24e60 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73  t( (v->db->flags
24e70 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   & SQLITE_Enable
24e80 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20  QPSG)==0 );.    
24e90 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
24ea0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
24eb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24ec0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
24ed0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
24ee0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
24ef0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
24f00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
24f10 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
24f20 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
24f30 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
24f40 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
24f50 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
24f60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24f70 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
24f80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24f90 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
24fa0 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
24fb0 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
24fc0 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
24fd0 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
24fe0 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
24ff0 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
25000 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
25010 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
25020 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
25030 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
25040 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
25050 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
25060 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
25070 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
25080 69 56 61 72 3e 30 20 29 3b 0a 20 20 61 73 73 65  iVar>0 );.  asse
25090 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67  rt( (v->db->flag
250a0 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s & SQLITE_Enabl
250b0 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69  eQPSG)==0 );.  i
250c0 66 28 20 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20  f( iVar>=32 ){. 
250d0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
250e0 20 30 78 38 30 30 30 30 30 30 30 3b 0a 20 20 7d   0x80000000;.  }
250f0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
25100 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
25110 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
25120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  }.}../*.** Cause
25130 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74   a function to t
25140 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
25150 20 69 74 20 77 61 73 20 63 61 6c 6c 20 66 72 6f   it was call fro
25160 6d 20 4f 50 5f 50 75 72 65 46 75 6e 63 0a 2a 2a  m OP_PureFunc.**
25170 20 72 61 74 68 65 72 20 74 68 61 6e 20 4f 50 5f   rather than OP_
25180 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  Function..**.** 
25190 4f 50 5f 50 75 72 65 46 75 6e 63 20 6d 65 61 6e  OP_PureFunc mean
251a0 73 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  s that the funct
251b0 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 65 74 65  ion must be dete
251c0 72 6d 69 6e 69 73 74 69 63 2c 20 61 6e 64 20 73  rministic, and s
251d0 68 6f 75 6c 64 0a 2a 2a 20 74 68 72 6f 77 20 61  hould.** throw a
251e0 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 69 73  n error if it is
251f0 20 67 69 76 65 6e 20 69 6e 70 75 74 73 20 74 68   given inputs th
25200 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74  at would make it
25210 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
25220 69 63 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ic..** This rout
25230 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ine is invoked b
25240 79 20 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63  y date/time func
25250 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 6e  tions that use n
25260 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
25270 0a 2a 2a 20 66 65 61 74 75 72 65 73 20 73 75 63  .** features suc
25280 68 20 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69  h as 'now'..*/.i
25290 6e 74 20 73 71 6c 69 74 65 33 4e 6f 74 50 75 72  nt sqlite3NotPur
252a0 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
252b0 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 23 69  ntext *pCtx){.#i
252c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
252d0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
252e0 34 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56  4.  if( pCtx->pV
252f0 64 62 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dbe==0 ) return 
25300 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
25310 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70  pCtx->pVdbe->aOp
25320 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f  [pCtx->iOp].opco
25330 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20  de==OP_PureFunc 
25340 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
25350 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
25360 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64  , .       "non-d
25370 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
25380 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65  ction in index e
25390 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 43 48 45  xpression or CHE
253a0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a  CK constraint",.
253b0 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20 20 20         -1);.    
253c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
253d0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66  return 1;.}..#if
253e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
253f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
25400 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
25410 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
25420 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
25430 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
25440 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
25450 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
25460 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
25470 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
25480 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
25490 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
254a0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
254b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
254c0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
254d0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
254e0 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
254f0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
25500 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a  {.  if( pVtab->z
25510 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71  ErrMsg ){.    sq
25520 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
25530 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
25540 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
25550 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
25560 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
25570 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
25580 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
25590 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
255a0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
255b0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
255c0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
255d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
255e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
255f0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
25600 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
25610 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66  E_HOOK../*.** If
25620 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25630 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
25640 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c  , release any al
25650 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
25660 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68  ated .** with th
25670 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69  e memory cells i
25680 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20  n the p->aMem[] 
25690 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65  array. Also free
256a0 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63   the UnpackedRec
256b0 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
256c0 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73   itself, using s
256d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
256e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
256f0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66  ion is used to f
25700 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ree UnpackedReco
25710 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61 6c  rd structures al
25720 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
25730 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f  e vdbeUnpackReco
25740 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  rd() function fo
25750 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63  und in vdbeapi.c
25760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25770 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
25780 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
25790 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63  nt nField, Unpac
257a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
257b0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
257c0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
257d0 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
257e0 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
257f0 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b  m = &p->aMem[i];
25800 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
25810 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  >zMalloc ) sqlit
25820 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
25830 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
25840 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
25850 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  N(db, p);.  }.}.
25860 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25870 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
25880 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65  E_HOOK */..#ifde
25890 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
258a0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
258b0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
258c0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
258d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   If this is an U
258e0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
258f0 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c  pre-update call,
25900 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20  .** then cursor 
25910 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25920 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  cond argument sh
25930 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68  ould point to th
25940 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74  e row about.** t
25950 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64  o be update or d
25960 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61  eleted. If the a
25970 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73  pplication calls
25980 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
25990 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65  te_old(),.** the
259a0 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
259b0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
259c0 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  m the row the cu
259d0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  rsor points to..
259e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
259f0 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
25a00 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d      /* Vdbe pre-
25a30 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69  update hook is i
25a40 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56  nvoked by */.  V
25a50 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a70 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62  * Cursor to grab
25a80 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
25a90 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  om */.  int op, 
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
25ac0 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  E_INSERT, UPDATE
25ad0 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
25ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
25b10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
25b20 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
25b30 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65        /* Modifie
25b40 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34  d table */.  i64
25b50 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20   iKey1,         
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b70 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75  Initial key valu
25b80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
25bb0 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63  er for new.* rec
25bc0 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ord */.){.  sqli
25bd0 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b  te3 *db = v->db;
25be0 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20  .  i64 iKey2;.  
25bf0 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64  PreUpdate preupd
25c00 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ate;.  const cha
25c10 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e  r *zTbl = pTab->
25c20 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20  zName;.  static 
25c30 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72  const u8 fakeSor
25c40 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61  tOrder = 0;..  a
25c50 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55  ssert( db->pPreU
25c60 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65  pdate==0 );.  me
25c70 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c  mset(&preupdate,
25c80 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70   0, sizeof(PreUp
25c90 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61  date));.  if( Ha
25ca0 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20  sRowid(pTab)==0 
25cb0 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69  ){.    iKey1 = i
25cc0 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72  Key2 = 0;.    pr
25cd0 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71  eupdate.pPk = sq
25ce0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
25cf0 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
25d00 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d  lse{.    if( op=
25d10 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
25d20 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
25d30 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e  v->aMem[iReg].u.
25d40 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
25d50 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79      iKey2 = iKey
25d60 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
25d70 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46  assert( pCsr->nF
25d80 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
25d90 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
25da0 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
25db0 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53  >nCol+1 && op==S
25dc0 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20  QLITE_DELETE && 
25dd0 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a  iReg==-1).  );..
25de0 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
25df0 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
25e00 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
25e10 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
25e20 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
25e30 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
25e40 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25e50 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
25e60 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
25e70 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
25e80 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25e90 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 70 54 61  .nKeyField = pTa
25ea0 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70  b->nCol;.  preup
25eb0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f  date.keyinfo.aSo
25ec0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
25ed0 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20  fakeSortOrder;. 
25ee0 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31   preupdate.iKey1
25ef0 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75   = iKey1;.  preu
25f00 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b  pdate.iKey2 = iK
25f10 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey2;.  preupdate
25f20 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20  .pTab = pTab;.. 
25f30 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
25f40 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20  = &preupdate;.  
25f50 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
25f60 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55  llback(db->pPreU
25f70 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70  pdateArg, db, op
25f80 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65  , zDb, zTbl, iKe
25f90 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62  y1, iKey2);.  db
25fa0 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 30  ->pPreUpdate = 0
25fb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
25fc0 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  e(db, preupdate.
25fd0 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65  aRecord);.  vdbe
25fe0 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
25ff0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26000 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
26010 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63  preupdate.pUnpac
26020 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ked);.  vdbeFree
26030 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
26040 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
26050 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
26060 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b  pdate.pNewUnpack
26070 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70  ed);.  if( preup
26080 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20  date.aNew ){.   
26090 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
260a0 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69  i=0; i<pCsr->nFi
260b0 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
260c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
260d0 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74  elease(&preupdat
260e0 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  e.aNew[i]);.    
260f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
26100 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75 70 64  reeNN(db, preupd
26110 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d  ate.aNew);.  }.}
26120 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26130 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
26140 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.