/ Hex Artifact Content
Login

Artifact 2e4a421bd3771ecd3b6c9a1c7abc7270a787a01b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 2d 3e 69 73 50 72 65  return (p->isPre
0720: 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a 53 71 6c  pareV2 ? p->zSql
0730: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
0740: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0750: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
0760: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
0770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0780: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
0790: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
07a0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
07b0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 6d  char *zTmp;.  tm
07c0: 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d  p = *pA;.  *pA =
07d0: 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d   *pB;.  *pB = tm
07e0: 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e  p;.  pTmp = pA->
07f0: 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65  pNext;.  pA->pNe
0800: 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a  xt = pB->pNext;.
0810: 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54    pB->pNext = pT
0820: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0830: 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50  >pPrev;.  pA->pP
0840: 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b  rev = pB->pPrev;
0850: 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70  .  pB->pPrev = p
0860: 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41  Tmp;.  zTmp = pA
0870: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53  ->zSql;.  pA->zS
0880: 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20  ql = pB->zSql;. 
0890: 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70   pB->zSql = zTmp
08a0: 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72  ;.  pB->isPrepar
08b0: 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70  eV2 = pA->isPrep
08c0: 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65 66  areV2;.}..#ifdef
08d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
08e0: 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67  .** Turn tracing
08f0: 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f   on or off.*/.vo
0900: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  id sqlite3VdbeTr
0910: 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c  ace(Vdbe *p, FIL
0920: 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e  E *trace){.  p->
0930: 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d  trace = trace;.}
0940: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0950: 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61  esize the Vdbe.a
0960: 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  Op array so that
0970: 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20   it is at least 
0980: 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68  one op larger th
0990: 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a  an .** it was..*
09a0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f  *.** If an out-o
09b0: 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f  f-memory error o
09c0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69  ccurs while resi
09d0: 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20  zing the array, 
09e0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
09f0: 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20  _NOMEM. In this 
0a00: 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e  case Vdbe.aOp an
0a10: 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20  d Vdbe.nOpAlloc 
0a20: 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61  remain .** uncha
0a30: 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f  nged (this is so
0a40: 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65   that any opcode
0a50: 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61  s already alloca
0a60: 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63  ted can be .** c
0a70: 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63  orrectly dealloc
0a80: 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
0a90: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0aa0: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0ab0: 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79   int growOpArray
0ac0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62  (Vdbe *p){.  Vdb
0ad0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  eOp *pNew;.  int
0ae0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0af0: 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc ? p->nOpAll
0b00: 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32  oc*2 : (int)(102
0b10: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a  4/sizeof(Op)));.
0b20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0b30: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0b40: 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   p->aOp, nNew*si
0b50: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0b60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0b70: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  nOpAlloc = sqlit
0b80: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
0b90: 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65  ->db, pNew)/size
0ba0: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61  of(Op);.    p->a
0bb0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
0bc0: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
0bd0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
0be0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a  TE_NOMEM);.}../*
0bf0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
0c00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
0c10: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
0c20: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
0c30: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
0c40: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
0c50: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
0c60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
0c70: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
0c80: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
0c90: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0ca0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
0cb0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
0cc0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
0cd0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
0ce0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
0cf0: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
0d00: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
0d10: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
0d20: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
0d30: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
0d40: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
0d50: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
0d60: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
0d70: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
0d80: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
0d90: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
0da0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0db0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0dc0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0dd0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
0de0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
0df0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
0e00: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
0e10: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
0e20: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
0e30: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
0e40: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
0e50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b  ->nOpAlloc<=i ){
0e60: 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41  .    if( growOpA
0e70: 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20  rray(p) ){.     
0e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
0e90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b  .  }.  p->nOp++;
0ea0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
0eb0: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  [i];.  pOp->opco
0ec0: 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70  de = (u8)op;.  p
0ed0: 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f  Op->p5 = 0;.  pO
0ee0: 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f  p->p1 = p1;.  pO
0ef0: 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f  p->p2 = p2;.  pO
0f00: 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f  p->p3 = p3;.  pO
0f10: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70  p->p4.p = 0;.  p
0f20: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
0f30: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78  NOTUSED;.  p->ex
0f40: 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  pired = 0;.#ifde
0f50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
0f60: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
0f70: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
0f80: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0f90: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0fa0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0fb0: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
0fc0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
0fd0: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
0fe0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
0ff0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1000: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1020: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1030: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1050: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1070: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1080: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1090: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10a0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
10b0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
10c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
10d0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
10e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
10f0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1110: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1120: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1130: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1140: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1150: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1160: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1180: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1190: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
11a0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
11b0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
11e0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1200: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1210: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1220: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1230: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1250: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1260: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1270: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1280: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1290: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
12a0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
12b0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
12c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
12d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
12e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
12f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1300: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1310: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1320: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1330: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1340: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1350: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1360: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1370: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1380: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
1390: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13a0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
13b0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
13c0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
13d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
13e0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
13f0: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1400: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1410: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1430: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1440: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1460: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1470: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
1480: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1490: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
14a0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
14b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
14d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
14e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
14f0: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
1500: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
1510: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
1520: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1530: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1540: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1550: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1560: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1570: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1580: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1590: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
15a0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
15b0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
15c0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
15d0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
15e0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
15f0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1600: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1610: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1620: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1630: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1640: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1650: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1660: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1670: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1680: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1690: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
16a0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
16b0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
16c0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
16d0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
16e0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
16f0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1700: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1710: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1720: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1730: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1740: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1750: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1770: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1780: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1790: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
17a0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
17b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
17d0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
17e0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
17f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1800: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1810: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1820: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
1830: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
1840: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
1850: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1860: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1870: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1880: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
18b0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
18c0: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
18d0: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
18e0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
18f0: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
1900: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1910: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
1920: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1930: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
1940: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1950: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1960: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1970: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1980: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1990: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
19a0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
19b0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
19c0: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
19d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
19e0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
19f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a00: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1a10: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a20: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1a30: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1a40: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1a50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1a60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1a70: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1a80: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1a90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1aa0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1ab0: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1ac0: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
1ad0: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1ae0: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1af0: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1b00: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1b10: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1b20: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1b30: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1b40: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1b50: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1b60: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1b70: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1b80: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1b90: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1ba0: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1bb0: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1bc0: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1bd0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1be0: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1bf0: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1c00: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1c10: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1c20: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1c30: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1c60: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1c70: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1c80: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1c90: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1ca0: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1cb0: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1cc0: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1cd0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1ce0: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1cf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1d00: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1d10: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1d20: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1d30: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1d40: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1d50: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1d60: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
1d70: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
1d80: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
1d90: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
1da0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
1db0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1de0: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
1df0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
1e00: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1e10: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
1e20: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
1e30: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e50: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
1e60: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
1e70: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
1e80: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
1e90: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
1ea0: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
1eb0: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
1ec0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
1ed0: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
1ee0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
1ef0: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
1f00: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
1f10: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
1f20: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
1f30: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
1f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
1f50: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
1f60: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
1f70: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
1f80: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
1f90: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
1fa0: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
1fb0: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
1fc0: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
1fd0: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
1fe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
1ff0: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
2000: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
2010: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
2020: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
2030: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
2040: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2050: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2060: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2070: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
2080: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2090: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
20a0: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
20b0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
20c0: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
20d0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
20e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20f0: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
2100: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
2110: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
2120: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
2130: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
2140: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2150: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2160: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2170: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
2180: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
2190: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
21a0: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
21b0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
21c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21d0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
21e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
21f0: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
2200: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
2210: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2220: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
2230: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
2240: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2250: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2260: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2270: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
2280: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
2290: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
22a0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
22b0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
22c0: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
22d0: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
22e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
2300: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
2310: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2320: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2330: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
2340: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2350: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2360: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2370: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
2380: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
2390: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
23a0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
23b0: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
23c0: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
23d0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
23e0: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
23f0: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
2400: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
2410: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
2420: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
2430: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
2440: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2450: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2460: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2470: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
2480: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
2490: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
24a0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
24b0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
24c0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
24d0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
24e0: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
24f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
2500: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
2510: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
2520: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
2530: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
2540: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2550: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2560: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2570: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
2580: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
2590: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
25a0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
25b0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
25c0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
25d0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
25e0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
25f0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2600: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
2610: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
2620: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
2630: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
2640: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2650: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2660: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2680: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
2690: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
26a0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
26b0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
26c0: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
26d0: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
26e0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
26f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
2700: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
2710: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
2720: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2730: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2740: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2750: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2770: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
2780: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2790: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
27a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
27b0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
27c0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
27d0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
27e0: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
27f0: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2800: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2810: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2820: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2830: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2840: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2850: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2860: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2870: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2880: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2890: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
28a0: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
28b0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
28c0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
28d0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
28e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
28f0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2900: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2910: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2920: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2930: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2940: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2950: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2960: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2970: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2980: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2990: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
29a0: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
29b0: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
29c0: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
29d0: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
29e0: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
29f0: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2a00: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2a10: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2a20: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a30: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2a40: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2a50: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2a60: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2a70: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2a80: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2a90: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2aa0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2ab0: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2ac0: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2ad0: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2ae0: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2af0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2b00: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2b10: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2b20: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2b30: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2b40: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2b50: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2b60: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2b70: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2b80: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2b90: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2ba0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2bb0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2bc0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2bd0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2be0: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2bf0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2c00: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2c10: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2c20: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2c30: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2c40: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2c50: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2c60: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2c70: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2c80: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2c90: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2ca0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2cb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2cc0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2cd0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2ce0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cf0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73  opcode==OP_Trans
2d00: 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70  action && pOp->p
2d10: 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  2!=0 ){.      p-
2d20: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23  >readOnly = 0;.#
2d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
2d60: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2d70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2d80: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
2d90: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2da0: 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p2;.    }else i
2db0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
2dc0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
2dd0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
2de0: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
2df0: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
2e00: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
2e10: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
2e20: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
2e30: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
2e40: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
2e50: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
2e60: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2e70: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
2e80: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
2e90: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
2ea0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2eb0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
2ec0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
2ed0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
2ee0: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
2ef0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2f00: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
2f10: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2f20: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2f30: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2f40: 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  axArgs;.}../*.**
2f50: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
2f60: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2f70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2f80: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
2f90: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
2fa0: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
2fb0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
2fc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2fd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
2fe0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
2ff0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3000: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
3010: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
3020: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
3030: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
3040: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
3050: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
3060: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
3070: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
3080: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
3090: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
30a0: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
30b0: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
30c0: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
30d0: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
30e0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
30f0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
3100: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
3110: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3120: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
3130: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
3140: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
3150: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
3160: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
3170: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
3180: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
3190: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
31a0: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
31b0: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
31c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
31d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
31e0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
31f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
3200: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
3210: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
3220: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
3230: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
3240: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
3250: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
3260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
3270: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
3280: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3290: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
32a0: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
32b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  /.  assert( p->a
32c0: 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30 20  Mutex.nMutex==0 
32d0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
32e0: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
32f0: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
3300: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
3310: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
3320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
3330: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
3340: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
3350: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
3360: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
3370: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3380: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
3390: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
33a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
33b0: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
33c0: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
33d0: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
33e0: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
33f0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
3400: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
3410: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
3420: 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  Op > p->nOpAlloc
3430: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
3440: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
3450: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
3460: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41   p->nOp;.  if( A
3470: 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a  LWAYS(nOp>0) ){.
3480: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
3490: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
34a0: 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20  *pIn = aOp;.    
34b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
34c0: 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20  i++, pIn++){.   
34d0: 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d     int p2 = pIn-
34e0: 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  >p2;.      VdbeO
34f0: 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f  p *pOut = &p->aO
3500: 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20  p[i+addr];.     
3510: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
3520: 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pIn->opcode;.   
3530: 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49     pOut->p1 = pI
3540: 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28  n->p1;.      if(
3550: 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65   p2<0 && (sqlite
3560: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3570: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
3580: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29  OPFLG_JUMP)!=0 )
3590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
35a0: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
35b0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
35c0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
35d0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
35e0: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
35f0: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
3600: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
3610: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3620: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
3630: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
3640: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
3650: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
3660: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
3670: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
3680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
3690: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
36a0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
36b0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
36c0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
36d0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
36f0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
3700: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
3710: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3720: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
3730: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3740: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3750: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3760: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3770: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3780: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3790: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
37a0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
37b0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
37c0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
37d0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
37e0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
37f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
3800: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3810: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
3820: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
3830: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
3850: 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  dr>=0 );.  if( p
3860: 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20  ->nOp>addr ){.  
3870: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3880: 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  1 = val;.  }.}..
3890: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
38a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32   value of the P2
38b0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
38c0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
38d0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
38e0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66  tine is useful f
38f0: 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d  or setting a jum
3900: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a  p destination..*
3910: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3920: 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20  beChangeP2(Vdbe 
3930: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3940: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3950: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
3960: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
3970: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
3980: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3990: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
39a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
39b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
39c0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
39d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
39e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
39f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3a00: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3a10: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
3a20: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3a30: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3a40: 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28  addr>=0 );.  if(
3a50: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a   p->nOp>addr ){.
3a60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3a70: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
3a80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3aa0: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
3ab0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
3ac0: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
3ad0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3ae0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
3af0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
3b00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3b10: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  0 );.  if( p->aO
3b20: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
3b30: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
3b40: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
3b50: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
3b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3b70: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
3b80: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
3b90: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
3ba0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
3bb0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3bc0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3bd0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
3be0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
3bf0: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
3c00: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
3c10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3c20: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
3c30: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
3c40: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
3c50: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
3c60: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
3c70: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
3c80: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
3c90: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
3ca0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
3cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
3cc0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
3cd0: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
3ce0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
3cf0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
3d00: 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61  f) && (pDef->fla
3d10: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
3d20: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
3d30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d40: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
3d50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3d60: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
3d70: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
3d80: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
3d90: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
3da0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
3db0: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
3dc0: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
3dd0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
3de0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
3df0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
3e00: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
3e10: 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  TF:.      case P
3e20: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
3e30: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
3e40: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3e50: 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20  INTARRAY:.      
3e60: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
3e70: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3e80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3e90: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
3ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3eb0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
3ec0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
3ed0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
3ee0: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
3ef0: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
3f00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3f10: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
3f20: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
3f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3f40: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
3f50: 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20  VdbeFunc, 0);.  
3f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3f70: 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e  ree(db, pVdbeFun
3f80: 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  c);.        brea
3f90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3fa0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
3fb0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
3fc0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3fd0: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
3fe0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3ff0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4000: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4020: 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74  ValueFree((sqlit
4030: 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20  e3_value*)p4);. 
4040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4050: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4060: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
4070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
4080: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
4090: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
40a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
40b0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
40c0: 4f 47 52 41 4d 20 3a 20 7b 0a 20 20 20 20 20 20  OGRAM : {.      
40d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 6f    sqlite3VdbePro
40e0: 67 72 61 6d 44 65 6c 65 74 65 28 64 62 2c 20 28  gramDelete(db, (
40f0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 29 70 34 2c  SubProgram *)p4,
4100: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
4110: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4120: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4130: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4140: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4150: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4160: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4170: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4180: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4190: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
41a0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
41b0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
41c0: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
41d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
41e0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
41f0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4200: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4210: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4220: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4230: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4240: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4250: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4260: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4270: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4280: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4290: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
42a0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
42b0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
42c0: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
42d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
42e0: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  aOp);.}../*.** D
42f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4300: 2d 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 53 75  -count on the Su
4310: 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75  bProgram structu
4320: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
4330: 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
4340: 65 6e 74 2e 20 49 66 20 74 68 65 20 72 65 66 2d  ent. If the ref-
4350: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
4360: 72 6f 2c 20 66 72 65 65 20 74 68 65 20 73 74 72  ro, free the str
4370: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4380: 65 20 61 72 72 61 79 20 6f 66 20 56 44 42 45 20  e array of VDBE 
4390: 6f 70 63 6f 64 65 73 20 73 74 6f 72 65 64 20 61  opcodes stored a
43a0: 73 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  s SubProgram.aOp
43b0: 20 69 73 20 66 72 65 65 64 20 69 66 0a 2a 2a 20   is freed if.** 
43c0: 65 69 74 68 65 72 20 74 68 65 20 72 65 66 2d 63  either the ref-c
43d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
43e0: 6f 20 6f 72 20 70 61 72 61 6d 65 74 65 72 20 66  o or parameter f
43f0: 72 65 65 6f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  reeop is non-zer
4400: 6f 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74  o..**.** Since t
4410: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
4420: 64 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  des pointed to b
4430: 79 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  y SubProgram.aOp
4440: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 0a 2a 2a   may directly.**
4450: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63   or indirectly c
4460: 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
4470: 63 65 20 74 6f 20 74 68 65 20 53 75 62 50 72 6f  ce to the SubPro
4480: 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 20 69  gram structure i
4490: 74 73 65 6c 66 2e 0a 2a 2a 20 42 79 20 70 61 73  tself..** By pas
44a0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  sing a non-zero 
44b0: 66 72 65 65 6f 70 20 70 61 72 61 6d 65 74 65 72  freeop parameter
44c0: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
44d0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
44e0: 0a 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 73  .** SubProgram s
44f0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
4500: 65 69 72 20 61 4f 70 20 61 72 72 61 79 73 20 61  eir aOp arrays a
4510: 72 65 20 66 72 65 65 64 2c 20 65 76 65 6e 20 77  re freed, even w
4520: 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
4530: 20 73 75 63 68 20 63 69 72 63 75 6c 61 72 20 72   such circular r
4540: 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2f 0a 76 6f  eferences..*/.vo
4550: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
4560: 6f 67 72 61 6d 44 65 6c 65 74 65 28 73 71 6c 69  ogramDelete(sqli
4570: 74 65 33 20 2a 64 62 2c 20 53 75 62 50 72 6f 67  te3 *db, SubProg
4580: 72 61 6d 20 2a 70 2c 20 69 6e 74 20 66 72 65 65  ram *p, int free
4590: 6f 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  op){.  if( p ){.
45a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
45b0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  Ref>0 );.    if(
45c0: 20 66 72 65 65 6f 70 20 7c 7c 20 70 2d 3e 6e 52   freeop || p->nR
45d0: 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 4f  ef==1 ){.      O
45e0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
45f0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20  .      p->aOp = 
4600: 30 3b 0a 20 20 20 20 20 20 76 64 62 65 46 72 65  0;.      vdbeFre
4610: 65 4f 70 41 72 72 61 79 28 64 62 2c 20 61 4f 70  eOpArray(db, aOp
4620: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 20  , p->nOp);.     
4630: 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 20   p->nOp = 0;.   
4640: 20 7d 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d   }.    p->nRef--
4650: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
4660: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  f==0 ){.      sq
4670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4680: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
4690: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
46a0: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
46b0: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
46c0: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
46d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
46e0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
46f0: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
4700: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4710: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4720: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4730: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4740: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68   = p->db;.    wh
4750: 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20  ile( N-- ){.    
4760: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4770: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4780: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
4790: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
47a0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
47b0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
47c0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
47d0: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
47e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
47f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4800: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4810: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4820: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4830: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4840: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4850: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4860: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4870: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4890: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
48a0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
48b0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
48c0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
48d0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
48e0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
48f0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4900: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4910: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4920: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4930: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4940: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4950: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4960: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4970: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4980: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4990: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
49a0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
49b0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
49c0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
49d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
49e0: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
49f0: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4a00: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4a10: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4a20: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4a30: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4a40: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4a50: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4a60: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4a70: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4a80: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4a90: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4aa0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4ab0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4ac0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4ad0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4ae0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4af0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4b00: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4b20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4b30: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4b40: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4b50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4b60: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4b70: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4b80: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4b90: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4ba0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4bb0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4bc0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4bd0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4be0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4bf0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4c00: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4c10: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4c20: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4c30: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4c40: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4c50: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4c60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4c70: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4c80: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4c90: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4ca0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4cb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4cc0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4cd0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4ce0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4cf0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4d20: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4d30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4d40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4d50: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4d60: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4d70: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4d80: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4d90: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4da0: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4db0: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4dc0: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4dd0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4de0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4df0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4e00: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4e10: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4e20: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4e30: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4e40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4e50: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4e60: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4e70: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
4e80: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4e90: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
4ea0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
4eb0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
4ec0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
4ed0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
4ee0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
4ef0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
4f00: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
4f10: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
4f20: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
4f30: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
4f40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4f50: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
4f60: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
4f70: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
4f80: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
4f90: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
4fa0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
4fb0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
4fc0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
4fd0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
4fe0: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
4ff0: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5000: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
5010: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
5020: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
5030: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
5040: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
5050: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
5060: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5070: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  fo = sqlite3Mall
5080: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
5090: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
50a0: 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
50b0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
50c0: 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72  {.      u8 *aSor
50d0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65  tOrder;.      me
50e0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
50f0: 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P4, nByte);.    
5100: 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    aSortOrder = p
5110: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5120: 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61  der;.      if( a
5130: 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  SortOrder ){.   
5140: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
5150: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
5160: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
5170: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
5180: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  eld];.        me
5190: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  mcpy(pKeyInfo->a
51a0: 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74  SortOrder, aSort
51b0: 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a  Order, nField);.
51c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
51d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
51e0: 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73  EYINFO;.    }els
51f0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  e{.      p->db->
5200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
5210: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
5220: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
5240: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
5250: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
5260: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
5270: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5280: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5290: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
52a0: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b  f( n==P4_VTAB ){
52b0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
52c0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
52d0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
52e0: 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69  4_VTAB;.    sqli
52f0: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
5300: 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20  ble *)zP4);.    
5310: 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65  assert( ((VTable
5320: 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e   *)zP4)->db==p->
5330: 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  db );.  }else if
5340: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
5350: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
5360: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
5370: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
5380: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
5390: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
53a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
53b0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
53c0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
53d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
53e0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
53f0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
5400: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
5410: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
5420: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
5430: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68  omment on the th
5440: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
5450: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
5460: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
5470: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
5480: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
5490: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
54a0: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
54b0: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
54c0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
54d0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
54e0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
54f0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
5500: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
5510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5520: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
5530: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5540: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5550: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5560: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5570: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5580: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
55a0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
55b0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
55c0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
55d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
55e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
55f0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
5600: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
5610: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ].zComment;.    
5620: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5630: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
5640: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5650: 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20  *pz);.    *pz = 
5660: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
5670: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
5680: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
5690: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
56a0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
56b0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
56c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
56d0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
56e0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
56f0: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  p ) return;.  sq
5700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5710: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61  p, OP_Noop);.  a
5720: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
5730: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
5740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5750: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
5760: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5770: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5780: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5790: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
57a0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
57b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
57c0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
57d0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
57e0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
57f0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
5800: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
5810: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
5820: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
5830: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
5840: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
5850: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
5860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5870: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
5880: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
5890: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
58a0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
58b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
58c0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
58d0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
58e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
58f0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
5900: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
5910: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
5920: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
5930: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
5940: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
5950: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
5960: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
5970: 20 69 73 20 72 65 61 64 61 62 6c 65 20 61 6e 64   is readable and
5980: 20 77 72 69 74 61 62 6c 65 2c 20 62 75 74 20 69   writable, but i
5990: 74 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e  t has no effect.
59a0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20    The return of 
59b0: 61 20 64 75 6d 6d 79 0a 2a 2a 20 6f 70 63 6f 64  a dummy.** opcod
59c0: 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c  e allows the cal
59d0: 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75  l to continue fu
59e0: 6e 63 74 69 6f 6e 69 6e 67 20 61 66 74 65 72 20  nctioning after 
59f0: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  a OOM fault with
5a00: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5a10: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
5a20: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
5a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5a40: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5a50: 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68  ..**.** About th
5a60: 65 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  e #ifdef SQLITE_
5a70: 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72  OMIT_TRACE:  Nor
5a80: 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74  mally, this rout
5a90: 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
5aa0: 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d  led.** unless p-
5ab0: 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73  >nOp>0.  This is
5ac0: 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20   because in the 
5ad0: 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54  absense of SQLIT
5ae0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a  E_OMIT_TRACE,.**
5af0: 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73   an OP_Trace ins
5b00: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61  truction is alwa
5b10: 79 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73  ys inserted by s
5b20: 71 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20  qlite3VdbeGet() 
5b30: 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20  as soon as.** a 
5b40: 6e 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61  new VDBE is crea
5b50: 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20  ted.  So we are 
5b60: 66 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72  free to set addr
5b70: 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74   to p->nOp-1 wit
5b80: 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74  hout.** having t
5b90: 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  o double-check t
5ba0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
5bb0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
5bc0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74  on-negative. But
5bd0: 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  .** if SQLITE_OM
5be0: 49 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69  IT_TRACE is defi
5bf0: 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63  ned, the OP_Trac
5c00: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  e is omitted and
5c10: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a   we do need to.*
5c20: 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75  * check the valu
5c30: 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65  e of p->nOp-1 be
5c40: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
5c50: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
5c60: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
5c70: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
5c80: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
5c90: 20 64 75 6d 6d 79 3b 0a 20 20 61 73 73 65 72 74   dummy;.  assert
5ca0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5cb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5cc0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5ce0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
5cf0: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
5d00: 72 6e 20 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69  rn &dummy;.#endi
5d10: 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  f.    addr = p->
5d20: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
5d30: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
5d40: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
5d50: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
5d60: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
5d70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5d80: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
5d90: 6e 20 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  n &dummy;.  }els
5da0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
5db0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
5dc0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
5dd0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
5de0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
5df0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
5e00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
5e10: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
5e20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5e30: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
5e40: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
5e50: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
5e60: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
5e70: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
5e80: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
5e90: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
5ea0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
5eb0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
5ec0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
5ed0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
5ee0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
5ef0: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
5f00: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
5f10: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
5f20: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
5f30: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
5f40: 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20  NFO_STATIC:.    
5f50: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
5f60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
5f70: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
5f80: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
5f90: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
5fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5fb0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
5fc0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
5fd0: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
5fe0: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
5ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6000: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
6010: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
6020: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
6030: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6040: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
6050: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
6060: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
6070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
6080: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6090: 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  n30(pColl->zName
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
60b0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
60d0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
60e0: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
60f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6110: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
6120: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
6130: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
6140: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
6150: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
6160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6170: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
6180: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6190: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
61a0: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
61b0: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
61c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
61d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
61e0: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
61f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6200: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
6210: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
6220: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
6230: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6240: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
6250: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
6260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6270: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
6280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6290: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
62a0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
62b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
62c0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
62e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
62f0: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
6300: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
6310: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
6320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6330: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
6340: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
6350: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
6360: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
6370: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6380: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
6390: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
63a0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
63b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
63c0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
63d0: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
63e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
63f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6400: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
6410: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6420: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6430: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
6440: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6450: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6460: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
6470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6490: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
64a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
64b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
64c0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
64d0: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
64e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
64f0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
6500: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
6510: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
6520: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
6530: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
6540: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
6550: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6560: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
6570: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
6580: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
6590: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
65a0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
65b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
65c0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
65d0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
65e0: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
65f0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
6600: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
6610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6620: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6630: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
6640: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
6650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6660: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
6670: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
6680: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
6690: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
66a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
66b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
66c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
66d0: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
66e0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
66f0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
6700: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
6710: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
6720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6730: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6740: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
6750: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
6760: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
6770: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6780: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
6790: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
67a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
67b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
67c0: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
67d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
67e0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
67f0: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
6800: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6810: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
6820: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
6830: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6840: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6850: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
6860: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6880: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
6890: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
68a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
68b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
68c0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
68d0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
68e0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
68f0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
6900: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
6910: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
6920: 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
6930: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6940: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6950: 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   i){.  int mask;
6960: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
6970: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
6980: 26 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29  && i<sizeof(u32)
6990: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
69a0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
69b0: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
69c0: 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29  .  mask = ((u32)
69d0: 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d  1)<<i;.  if( (p-
69e0: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
69f0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
6a00: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
6a10: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
6a20: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
6a30: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
6a40: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
6a50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
6a60: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
6a70: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
6a80: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6a90: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
6aa0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
6ab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6ac0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
6ad0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
6ae0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
6af0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
6b00: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
6b10: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
6b20: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
6b30: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6b40: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
6b50: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
6b60: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
6b70: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
6b80: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
6b90: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
6ba0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
6bb0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
6bc0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
6bd0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
6bf0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6c00: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
6c10: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
6c20: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
6c30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6c40: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
6c50: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
6c60: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
6c70: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
6c80: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
6c90: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
6ca0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
6cb0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
6cc0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
6cd0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
6ce0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
6cf0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
6d00: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
6d10: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
6d20: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6d30: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
6d40: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
6d50: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f 72  cFailed;.    for
6d60: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
6d70: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
6d80: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
6d90: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
6da0: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20  b==p[1].db );.. 
6db0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
6dc0: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
6dd0: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
6de0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
6df0: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
6e00: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
6e10: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
6e20: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
6e30: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
6e40: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
6e50: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
6e60: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
6e70: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
6e80: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
6e90: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
6ea0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
6eb0: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
6ec0: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
6ed0: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
6ee0: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
6ef0: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
6f00: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
6f10: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
6f20: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
6f30: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
6f40: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
6f50: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
6f60: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
6f70: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
6f80: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
6f90: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
6fa0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
6fb0: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
6fc0: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
6fd0: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
6fe0: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
6ff0: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
7000: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
7010: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
7020: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
7030: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
7040: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
7050: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
7060: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
7070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7080: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7090: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
70a0: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
70b0: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
70c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
70d0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
70e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
70f0: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
7100: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7110: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7120: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7130: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
7140: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
7150: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
7160: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
7170: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7180: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7190: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
71a0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
71b0: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
71c0: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
71d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
71e0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
71f0: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7200: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7210: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7220: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7230: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7240: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7250: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7260: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7270: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7280: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7290: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
72a0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
72b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
72c0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
72d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
72e0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
72f0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7300: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7310: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7320: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7330: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7340: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7350: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7360: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7370: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7380: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7390: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
73a0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
73b0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
73c0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
73d0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
73e0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
73f0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
7400: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
7410: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
7420: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
7430: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
7440: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
7450: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
7460: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
7470: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
7480: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
7490: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
74a0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
74b0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
74c0: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
74d0: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
74e0: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
74f0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
7500: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
7510: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
7520: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
7530: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
7540: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
7550: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
7560: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
7570: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
7580: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
7590: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
75a0: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
75b0: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
75c0: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
75d0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
75f0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
7600: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
7630: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
7640: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
7650: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
7680: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
7690: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
76a0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
76b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
76c0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
76d0: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
76e0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
7710: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
7720: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
7730: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7750: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
7760: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
7770: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
77a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
77b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
77e0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
77f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
7800: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46  ->aMem[1];  /* F
7810: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
7820: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
7830: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
7840: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7850: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7860: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
7870: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
7880: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20  LITE_MAGIC_BUSY 
7890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
78b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
78c0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
78d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
78e0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
78f0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
7900: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
7910: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
7920: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
7930: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
7940: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
7950: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
7960: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
7970: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
7980: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
7990: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
79a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
79b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
79c0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66  (pMem, 8);..  if
79d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
79e0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
79f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
7a00: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
7a10: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
7a20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7a30: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
7a40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
7a50: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
7a60: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7a70: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
7a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7a90: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  R;.  }..  /* Whe
7aa0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7ab0: 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63  output rows reac
7ac0: 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d  hes nRow, that m
7ad0: 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69  eans the.  ** li
7ae0: 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  sting has finish
7af0: 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  ed and sqlite3_s
7b00: 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74  tep() should ret
7b10: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
7b20: 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68  .  ** nRow is th
7b30: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
7b40: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
7b50: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c  he main program,
7b60: 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73   plus.  ** the s
7b70: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
7b80: 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20   of rows in all 
7b90: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7ba0: 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a  ams encountered.
7bb0: 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68    ** so far.  Th
7bc0: 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c  e nRow value wil
7bd0: 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65  l increase as ne
7be0: 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  w trigger subpro
7bf0: 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65  grams are.  ** e
7c00: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20  ncountered, but 
7c10: 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74  p->pc will event
7c20: 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74  ually catch up t
7c30: 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e  o nRow..  */.  n
7c40: 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  Row = p->nOp;.  
7c50: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
7c60: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
7c70: 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63  first 8 memory c
7c80: 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f  ells are used fo
7c90: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
7ca0: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20  .  So we will.  
7cb0: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20    ** commandeer 
7cc0: 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20  the 9th cell to 
7cd0: 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66  use as storage f
7ce0: 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  or an array of p
7cf0: 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74  ointers.    ** t
7d00: 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  o trigger subpro
7d10: 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45  grams.  The VDBE
7d20: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7d30: 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  o have at least 
7d40: 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20  9.    ** cells. 
7d50: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
7d60: 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20  p->nMem>9 );.   
7d70: 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d   pSub = &p->aMem
7d80: 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75  [9];.    if( pSu
7d90: 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  b->flags&MEM_Blo
7da0: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  b ){.      /* On
7db0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
7dc0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
7dd0: 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c  ), pSub will hol
7de0: 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  d a NULL.  It is
7df0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
7e00: 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20  lized to a BLOB 
7e10: 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f  by the P4_SUBPRO
7e20: 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20  GRAM processing 
7e30: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20  logic below */. 
7e40: 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62       nSub = pSub
7e50: 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a  ->n/sizeof(Vdbe*
7e60: 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d  );.      apSub =
7e70: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
7e80: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20  pSub->z;.    }. 
7e90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
7ea0: 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; i++){.      
7eb0: 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d  nRow += apSub[i]
7ec0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
7ed0: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
7ee0: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
7ef0: 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e  e( i<nRow && p->
7f00: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
7f10: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
7f20: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
7f30: 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20  if( i>=nRow ){. 
7f40: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
7f50: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
7f60: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
7f70: 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69  lse if( db->u1.i
7f80: 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a  sInterrupted ){.
7f90: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
7fa0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
7fb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7fc0: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
7fd0: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
7fe0: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
7ff0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
8000: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
8010: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
8020: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
8030: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
8040: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
8050: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
8060: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
8070: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
8080: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
8090: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
80a0: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
80b0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
80c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
80d0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
80e0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
80f0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
8100: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
8110: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
8120: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
8130: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
8140: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
8150: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
8160: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
8170: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
8180: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
8190: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
81a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
81b0: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
81c0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
81d0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
81e0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
81f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
8200: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8210: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
8220: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  R;.      pMem->u
8230: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
8260: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
8270: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
8280: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8290: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
82a0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
82b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
82c0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
82d0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
82e0: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
82f0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
8300: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
8310: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
8320: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8330: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
8340: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8350: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
8360: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
8370: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
8380: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
8390: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
83a0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
83b0: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
83c0: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
83d0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
83e0: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
83f0: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
8400: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
8410: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
8420: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
8430: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
8440: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
8450: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
8460: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
8470: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
8480: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
8490: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
84a0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
84b0: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
84c0: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
84d0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
84e0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
84f0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
8500: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
8510: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
8520: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8530: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
8540: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
8550: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8560: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
8570: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
8580: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
8590: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
85a0: 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  Byte, 1) ){.    
85b0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
85c0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
85d0: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  b->z;.          
85e0: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
85f0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
8600: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
8610: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42  ->flags |= MEM_B
8620: 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  lob;.          p
8630: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
8640: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8650: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8660: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8670: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8680: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
8690: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
86c0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
86d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
86e0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
86f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8700: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
8710: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
8720: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8740: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
8750: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
8760: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
8770: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
8780: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8790: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
87a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
87b0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
87c0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
87e0: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
87f0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8800: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8810: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
8820: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
8830: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
8840: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20  32, 0) ){       
8850: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
8860: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
8870: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8880: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8890: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
88a0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
88b0: 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45  ags = MEM_Dyn|ME
88c0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
88d0: 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50      z = displayP
88e0: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
88f0: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d  32);.    if( z!=
8900: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
8910: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
8920: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d  etStr(pMem, z, -
8930: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8940: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
8950: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
8960: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
8970: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8980: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8990: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
89a0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
89b0: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  F8;.    }.    pM
89c0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
89d0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
89e0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
89f0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8a00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
8a10: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
8a20: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   4, 0) ){.      
8a30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
8a40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8a50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8a60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
8a80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
8a90: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
8aa0: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
8ab0: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  n = 2;.      sql
8ac0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
8ad0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
8ae0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
8af0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P5 */.      pMe
8b00: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8b10: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
8b20: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
8b30: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
8b40: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51  ++;.  .#ifdef SQ
8b50: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
8b60: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
8b70: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  nt ){.        pM
8b80: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8b90: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
8ba0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
8bb0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  pOp->zComment;. 
8bc0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
8bd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8be0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
8bf0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
8c00: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
8c10: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8c20: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
8c30: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
8c40: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
8c50: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8c60: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c80: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
8c90: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
8ca0: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20  = SQLITE_NULL;. 
8cb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8cc0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
8cd0: 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c  = 8 - 5*(p->expl
8ce0: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72  ain-1);.    p->r
8cf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8d00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
8d10: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
8d20: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
8d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8d40: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
8d50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8d60: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
8d70: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
8d80: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
8d90: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
8da0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
8db0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
8dc0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
8dd0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
8de0: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
8df0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
8e00: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
8e10: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
8e20: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
8e30: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
8e40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
8e50: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
8e60: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
8e70: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
8e80: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
8e90: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
8ea0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8eb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8ec0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
8ed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8ee0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
8ef0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
8f00: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
8f10: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
8f20: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8f30: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
8f40: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
8f50: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
8f60: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
8f80: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
8f90: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
8fa0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
8fb0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
8fc0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
8fd0: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
8fe0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
8ff0: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
9000: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
9010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9020: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
9030: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
9040: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
9050: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
9060: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
9070: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
9080: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9090: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
90a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
90b0: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
90c0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
90d0: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
90e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
90f0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
9100: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9110: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
9120: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9130: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
9140: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9150: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9160: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
9170: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
9180: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
9190: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
91a0: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
91b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
91c0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
91d0: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
91e0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
91f0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9200: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
9210: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
9220: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
9230: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
9240: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
9250: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
9260: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
9270: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
9280: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
9290: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
92a0: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
92b0: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
92c0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
92d0: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
92e0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
92f0: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
9300: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
9310: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
9320: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
9330: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
9340: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
9350: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
9360: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
9370: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
9380: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9390: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
93a0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
93b0: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
93c0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
93d0: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
93e0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
93f0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
9400: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
9410: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
9420: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
9430: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
9440: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
9450: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
9460: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
9470: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
9480: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
9490: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
94a0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
94b0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
94c0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
94d0: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
94e0: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
94f0: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
9500: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
9510: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
9520: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
9530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9540: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
9550: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
9560: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
9570: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
9580: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
9590: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
95a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
95b0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
95c0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
95d0: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
95e0: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
95f0: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
9600: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
9610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9620: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
9630: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
9640: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
9650: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
9660: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
9670: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
9680: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
9690: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
96a0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
96b0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
96c0: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
96d0: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
96e0: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
96f0: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
9700: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
9710: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
9720: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
9730: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
9740: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
9750: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
9760: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
9770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9780: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Buf;.}../*.** Pr
9790: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
97a0: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
97b0: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
97c0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
97d0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
97e0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
97f0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
9800: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
9810: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
9820: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
9830: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
9840: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
9850: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
9860: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
9870: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
9880: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
9890: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
98a0: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
98b0: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
98c0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
98d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
98e0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
98f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
9900: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74  on a single virt
9910: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
9920: 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69  The first call i
9930: 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d  s made while com
9940: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73  piling the SQL s
9950: 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71  tatement. Subseq
9960: 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72  uent.** calls ar
9970: 65 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f  e made as part o
9980: 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  f the process of
9990: 20 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61   resetting a sta
99a0: 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20  tement to be.** 
99b0: 72 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f  re-executed (fro
99c0: 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  m a call to sqli
99d0: 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68  te3_reset()). Th
99e0: 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43  e nVar, nMem, nC
99f0: 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73  ursor .** and is
9a00: 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65  Explain paramete
9a10: 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73  rs are only pass
9a20: 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  ed correct value
9a30: 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
9a40: 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  .** the function
9a50: 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73   is called. On s
9a60: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c  ubsequent calls,
9a70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
9a80: 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69  set(), nVar.** i
9a90: 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20  s passed -1 and 
9aa0: 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e  nMem, nCursor an
9ab0: 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20  d isExplain are 
9ac0: 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e  all passed zero.
9ad0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9ae0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
9af0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
9b20: 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20   int nVar,      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27  /* Number of '?'
9b50: 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20   see in the SQL 
9b60: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
9b70: 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20  nt nMem,        
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b90: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
9ba0: 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63  y cells to alloc
9bb0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ate */.  int nCu
9bc0: 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rsor,           
9bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9be0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20  r of cursors to 
9bf0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
9c00: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c20: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
9c30: 66 20 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f  f args in SubPro
9c40: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69  grams */.  int i
9c50: 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20  sExplain,       
9c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9c70: 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e  e if the EXPLAIN
9c80: 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65   keywords is pre
9c90: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73  sent */.  int us
9ca0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20  esStmtJournal   
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9cc0: 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65   to set Vdbe.use
9cd0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  sStmtJournal */.
9ce0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
9cf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
9d00: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
9d10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9d20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
9d30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
9d40: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
9d50: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
9d60: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
9d70: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
9d80: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
9d90: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
9da0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
9db0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
9dc0: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
9dd0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
9de0: 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  N;..  /* For eac
9df0: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
9e00: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
9e10: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
9e20: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
9e30: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
9e40: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
9e50: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
9e60: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
9e70: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
9e80: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
9e90: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
9ea0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
9eb0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
9ec0: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
9ed0: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
9ee0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
9ef0: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
9f00: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
9f10: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
9f20: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
9f30: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
9f40: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
9f50: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
9f60: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
9f70: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
9f80: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
9f90: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
9fa0: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
9fb0: 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  sor;..  /* Alloc
9fc0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
9fd0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20  mory registers, 
9fe0: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56  SQL variables, V
9ff0: 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20  DBE cursors and 
a000: 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74  .  ** an array t
a010: 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75  o marshal SQL fu
a020: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
a030: 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c   in. This is onl
a040: 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20  y done the.  ** 
a050: 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
a060: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a070: 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56  ed for a given V
a080: 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74  DBE, not when it
a090: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63   is.  ** being c
a0a0: 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  alled from sqlit
a0b0: 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65  e3_reset() to re
a0c0: 73 65 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  set the virtual 
a0d0: 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  machine..  */.  
a0e0: 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41  if( nVar>=0 && A
a0f0: 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63  LWAYS(db->malloc
a100: 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20  Failed==0) ){.  
a110: 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38    u8 *zCsr = (u8
a120: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   *)&p->aOp[p->nO
a130: 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  p];       /* Mem
a140: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
a150: 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20  r alloation */. 
a160: 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75     u8 *zEnd = (u
a170: 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  8 *)&p->aOp[p->n
a180: 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69  OpAlloc];  /* Fi
a190: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61 76  rst byte past av
a1a0: 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20  ailable mem */. 
a1b0: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
a1e0: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
a1f0: 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20  ory needed */.. 
a200: 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75     resolveP2Valu
a210: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
a220: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
a230: 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53  rnal = (u8)usesS
a240: 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  tmtJournal;.    
a250: 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26  if( isExplain &&
a260: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
a270: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20    nMem = 10;.   
a280: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43   }.    memset(zC
a290: 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72  sr, 0, zEnd-zCsr
a2a0: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28  );.    zCsr += (
a2b0: 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37  zCsr - (u8*)0)&7
a2c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49  ;.    assert( EI
a2d0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
a2e0: 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20  NT(zCsr) );..   
a2f0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
a300: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
a310: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
a320: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
a330: 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61  in two.    ** pa
a340: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
a350: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
a360: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
a370: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20   space at the . 
a380: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
a390: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
a3a0: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
a3b0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
a3c0: 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65  memory.    ** re
a3d0: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
a3e0: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
a3f0: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
a400: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  n the second.   
a410: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
a420: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
a430: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
a440: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a  ocation.  .    *
a450: 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 77  *.    ** This tw
a460: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
a470: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
a480: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
a490: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20  ssible from.    
a4a0: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
a4b0: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
a4c0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
a4d0: 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69  rray can signifi
a4e0: 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65  cantly.    ** re
a4f0: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
a500: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
a510: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
a520: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
a530: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42     do {.      nB
a540: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  yte = 0;.      p
a550: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
a560: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ace(p->aMem, nMe
a570: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
a580: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
a590: 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  te);.      p->aV
a5a0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
a5b0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
a5c0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
a5d0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
a5e0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
a5f0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
a600: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
a610: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c  of(Mem*), &zCsr,
a620: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a630: 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d        p->azVar =
a640: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
a650: 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  zVar, nVar*sizeo
a660: 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c  f(char*), &zCsr,
a670: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a680: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
a690: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
a6a0: 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69  pCsr, nCursor*si
a6b0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
a6c0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
a6e0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
a6f0: 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  te);.      if( n
a700: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
a710: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
a720: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a730: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
a740: 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20   }.      zCsr = 
a750: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20  p->pFree;.      
a760: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
a770: 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  te];.    }while(
a780: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
a790: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
a7a0: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
a7b0: 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20   (u16)nCursor;. 
a7c0: 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29     if( p->aVar )
a7d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20  {.      p->nVar 
a7e0: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
a7f0: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
a800: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
a810: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
a820: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
a830: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
a840: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
a850: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
a860: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
a870: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
a8a0: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
a8b0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
a8c0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
a8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
a8e0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
a8f0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f  em-1 */.      fo
a900: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
a910: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
a920: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
a930: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
a940: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
a950: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
a960: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
a970: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
a980: 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65  or(n=1; n<p->nMe
a990: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; n++){.    ass
a9a0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e  ert( p->aMem[n].
a9b0: 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65  db==db );.  }.#e
a9c0: 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20  ndif..  p->pc = 
a9d0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
a9e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
a9f0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
aa00: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
aa10: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
aa20: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
aa30: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
aa40: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
aa50: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
aa60: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
aa70: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
aa80: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
aa90: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
aaa0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
aab0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
aac0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
aad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
aae0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
aaf0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
ab00: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
ab10: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
ab20: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
ab30: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
ab40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
ab50: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
ab60: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
ab70: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
ab80: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
ab90: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
aba0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
abb0: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
abc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
abd0: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
abe0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
abf0: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
ac00: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
ac10: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
ac20: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
ac30: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
ac40: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
ac50: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
ac60: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
ac70: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
ac80: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
ac90: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
aca0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
acb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
acc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
acd0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
ace0: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
acf0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
ad00: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
ad10: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
ad20: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
ad30: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
ad40: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
ad50: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
ad60: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
ad70: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
ad80: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
ad90: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
ada0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
adb0: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
adc0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
add0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
ade0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
adf0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ae00: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
ae10: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
ae20: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
ae30: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
ae40: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
ae50: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
ae60: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
ae70: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
ae80: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
ae90: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
aea0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
aeb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
aec0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
aed0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
aee0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
aef0: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
af00: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
af10: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
af20: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
af30: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
af40: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
af50: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
af60: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
af70: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
af80: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
af90: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
afa0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
afb0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
afc0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
afd0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
afe0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
aff0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
b000: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
b010: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
b020: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
b030: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
b040: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
b050: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
b060: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
b070: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
b080: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
b090: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
b0a0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
b0b0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
b0c0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
b0d0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
b0e0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
b0f0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
b100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
b110: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
b120: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
b130: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
b140: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
b150: 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20  e = p->pFrame;. 
b160: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
b170: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
b180: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
b190: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
b1a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b1b0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
b1c0: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
b1d0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
b1e0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
b1f0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
b200: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b210: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
b220: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
b230: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
b240: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
b250: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
b260: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b270: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
b280: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
b290: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
b2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b2b0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
b2c0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
b2d0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
b2e0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
b2f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
b300: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
b310: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
b320: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
b330: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
b340: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
b350: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
b360: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
b370: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
b380: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
b390: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
b3a0: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
b3b0: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
b3c0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
b3d0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
b3e0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
b3f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
b400: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b410: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
b420: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b430: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
b440: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
b450: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
b460: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
b470: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b480: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
b490: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b4a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
b4b0: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
b4c0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70  p->apCsr==0 || p
b4d0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
b4e0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
b4f0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
b500: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20  ert( p->aMem==0 
b510: 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  || p->aMem[i].fl
b520: 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
b530: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
b540: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b550: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
b560: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
b570: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
b580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
b590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
b5a0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
b5b0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
b5c0: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
b5d0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
b5e0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
b5f0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
b600: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
b610: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
b620: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
b630: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
b640: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
b650: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
b660: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
b670: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
b680: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
b690: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
b6a0: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
b6b0: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
b6c0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
b6d0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
b6e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
b6f0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
b700: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
b710: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
b720: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
b730: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b740: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
b750: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
b760: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
b770: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
b780: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
b790: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
b7a0: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
b7b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
b7c0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
b7d0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
b7e0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
b7f0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
b800: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
b810: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
b820: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
b830: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
b840: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
b850: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
b860: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
b870: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
b880: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
b890: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
b8a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
b8b0: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
b8c0: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
b8d0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
b8e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
b8f0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
b900: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
b910: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
b920: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
b930: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
b940: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
b950: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
b960: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
b970: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
b980: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
b990: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
b9a0: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
b9b0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
b9c0: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
b9d0: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
b9e0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
b9f0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
ba00: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
ba10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ba20: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
ba30: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ba40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
ba50: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
ba60: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
ba70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ba90: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
baa0: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
bab0: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
bae0: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
baf0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
bb00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
bb20: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
bb30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
bb40: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
bb50: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
bb60: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bb70: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
bb80: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
bb90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
bba0: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
bbb0: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
bbc0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
bbd0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
bbe0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
bbf0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
bc00: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
bc10: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
bc20: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
bc30: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
bc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bc50: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
bc60: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
bc70: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
bc80: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
bc90: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
bca0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bcb0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
bcc0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
bcd0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
bce0: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
bcf0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
bd00: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
bd10: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
bd20: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
bd30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
bd40: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
bd50: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
bd60: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
bd70: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
bd80: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
bd90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
bda0: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
bdb0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
bdc0: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
bdd0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
bde0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
bdf0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
be00: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
be10: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
be20: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
be30: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
be40: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
be50: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
be60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
be70: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
be80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
be90: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
bea0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
beb0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
bec0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bed0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
bee0: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
bef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bf00: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
bf10: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
bf20: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
bf30: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
bf40: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
bf50: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
bf60: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
bf70: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
bf80: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
bf90: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
bfa0: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
bfb0: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
bfc0: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
bfd0: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
bfe0: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
bff0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
c000: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
c010: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
c020: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
c030: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
c040: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c050: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
c060: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
c070: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
c080: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
c090: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
c0a0: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
c0b0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
c0c0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
c0d0: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
c0e0: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
c0f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c100: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
c110: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
c120: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
c130: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
c140: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
c150: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
c160: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
c170: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
c180: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
c190: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
c1a0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
c1b0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
c1c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
c1d0: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
c1e0: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
c1f0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
c200: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
c210: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
c220: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
c230: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
c240: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
c250: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
c260: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
c270: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
c280: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
c290: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
c2a0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
c2b0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
c2c0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
c2d0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
c2e0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
c2f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
c300: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
c310: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
c320: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
c330: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
c340: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
c350: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
c360: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
c370: 6b 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73  k ){.    (void)s
c380: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
c390: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62  db);.    rc = db
c3a0: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
c3b0: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
c3c0: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
c3d0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
c3e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
c3f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c400: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
c410: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c420: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
c430: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
c440: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
c450: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
c460: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
c470: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
c480: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
c490: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
c4a0: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
c4b0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
c4c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
c4d0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
c4e0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
c4f0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
c500: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
c510: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
c520: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
c530: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
c540: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
c550: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
c560: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
c570: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
c580: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
c590: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
c5a0: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
c5b0: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
c5c0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
c5d0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
c5e0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
c5f0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
c600: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
c610: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
c620: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
c630: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
c640: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
c650: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
c660: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
c670: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
c680: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c690: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
c6a0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
c6b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
c6c0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
c6d0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
c6e0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
c6f0: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
c700: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
c710: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
c720: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
c730: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
c740: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
c750: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
c760: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
c770: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
c780: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
c790: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
c7a0: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
c7b0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
c7c0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
c7d0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
c7e0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
c7f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
c800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
c810: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
c820: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
c830: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
c840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
c850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c860: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
c870: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
c880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c890: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c8a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
c8b0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
c8c0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
c8d0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
c8e0: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
c8f0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
c900: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
c910: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
c920: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
c930: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c940: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
c950: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
c960: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
c970: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
c980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c990: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
c9a0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
c9b0: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
c9c0: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
c9d0: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
c9e0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
c9f0: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
ca00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ca10: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
ca20: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
ca30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
ca40: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
ca50: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
ca60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
ca70: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
ca80: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
ca90: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
caa0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
cad0: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
cae0: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
caf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
cb00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
cb10: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
cb20: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
cb30: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
cb40: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
cb50: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cb60: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
cb70: 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30  nFile, iRandom&0
cb80: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
cb90: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
cba0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cbb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
cbd0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
cbe0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
cbf0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
cc00: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
cc10: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
cc20: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
cc30: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
cc40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cc50: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
cc60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
cc70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cc80: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
cc90: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
cca0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
ccb0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
ccc0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
ccd0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
cce0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
ccf0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
cd00: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
cd10: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
cd20: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
cd30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cd40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
cd50: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
cd60: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
cd70: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
cd80: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
cd90: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
cda0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
cdb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
cdc0: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
cdd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cde0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
cdf0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
ce00: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
ce10: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
ce20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce30: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
ce40: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
ce50: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
ce60: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
ce70: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
ce80: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
ce90: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
cea0: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
ceb0: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
cec0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
ced0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
cee0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
cef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
cf00: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
cf10: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
cf20: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
cf30: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
cf40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
cf50: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
cf60: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
cf70: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
cf80: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
cf90: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 5b 30 5d 3d  ==0 || zFile[0]=
cfa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cfb0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
cfc0: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
cfd0: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
cfe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
cff0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
d000: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
d010: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
d020: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
d030: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
d040: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d050: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d060: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
d070: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
d080: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
d090: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
d0a0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
d0b0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
d0c0: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
d0d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d0e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d0f0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
d100: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
d110: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
d120: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
d130: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
d140: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d150: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
d160: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
d170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d180: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
d190: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
d1a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
d1b0: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
d1c0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
d1d0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
d1e0: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
d1f0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
d200: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
d210: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
d220: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
d230: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
d240: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
d250: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
d260: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
d270: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d280: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
d290: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
d2a0: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
d2b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
d2c0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
d2d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
d2e0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
d2f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d300: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d310: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
d320: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
d330: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
d340: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
d350: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
d360: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
d370: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
d380: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
d390: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
d3a0: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
d3b0: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
d3c0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
d3d0: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
d3e0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
d3f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d400: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
d410: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
d420: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
d430: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
d440: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
d450: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
d460: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
d470: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
d480: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
d490: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
d4a0: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
d4b0: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
d4c0: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
d4d0: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
d4e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d4f0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
d500: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
d510: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
d520: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
d530: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
d540: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
d550: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d560: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
d570: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d580: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d590: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
d5a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
d5b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
d5c0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
d5d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
d5e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d5f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
d600: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
d610: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d630: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
d640: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
d650: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
d660: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
d670: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d680: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
d690: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
d6a0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
d6b0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
d6c0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
d6d0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
d6e0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
d6f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
d700: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
d710: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
d720: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
d730: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
d740: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
d750: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d760: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
d770: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
d780: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
d790: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
d7a0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
d7b0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
d7c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d7d0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
d7e0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
d7f0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
d800: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d810: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
d820: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
d830: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
d840: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d850: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
d860: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
d870: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
d880: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
d890: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
d8a0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
d8b0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
d8c0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
d8d0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
d8e0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
d8f0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
d900: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
d910: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
d920: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
d930: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
d940: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
d950: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
d960: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
d970: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
d980: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d990: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
d9a0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
d9b0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
d9c0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d9d0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
d9e0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
d9f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
da00: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
da10: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
da20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
da30: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
da40: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
da50: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
da60: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
da70: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
da80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
da90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
daa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
dab0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
dac0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
dad0: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
dae0: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
daf0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
db00: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
db10: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
db20: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
db30: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
db40: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
db50: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
db60: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
db70: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
db80: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
db90: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
dba0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
dbb0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
dbc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
dbd0: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
dbe0: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
dbf0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
dc00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
dc10: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
dc20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
dc30: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
dc40: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
dc50: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ite = 0;.  p = d
dc60: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
dc70: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
dc80: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
dc90: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
dca0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
dcb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
dcc0: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
dcd0: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nWrite++;.    }.
dce0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
dcf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dd00: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
dd10: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65  dbeCnt );.  asse
dd20: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
dd30: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a  writeVdbeCnt );.
dd40: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
dd50: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
dd60: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
dd70: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74  .** For every Bt
dd80: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61  ree that in data
dd90: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dda0: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  db which .** has
ddb0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
ddc0: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69  "trip" or invali
ddd0: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72  date each cursor
dde0: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65   in.** that Btre
ddf0: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
de00: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  n modified so th
de10: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
de20: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73   can never be us
de30: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ed again.  This 
de40: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72  happens when a r
de50: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75  ollback.*** occu
de60: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  rs.  We have to 
de70: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68  trip all the oth
de80: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e  er cursors, even
de90: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  .** cursor from 
dea0: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66  other VMs in dif
deb0: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  ferent database 
dec0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20  connections,.** 
ded0: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  so that none of 
dee0: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20  them try to use 
def0: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63  the data at whic
df00: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70  h they.** were p
df10: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63  ointing and whic
df20: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62  h now may have b
df30: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a  een changed due.
df40: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  ** to the rollba
df50: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62  ck..**.** Rememb
df60: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61  er that a rollba
df70: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61  ck can delete ta
df80: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e  bles complete an
df90: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f  d.** reorder roo
dfa0: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69  tpages.  So it i
dfb0: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
dfc0: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a   just to save.**
dfd0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
dfe0: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61  e cursor.  We ha
dff0: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ve to invalidate
e000: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73   the cursor.** s
e010: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
e020: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a  er used again..*
e030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
e040: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
e050: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
e060: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
e070: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
e080: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
e090: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
e0a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e0b0: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73  ;.    if( p && s
e0c0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
e0d0: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
e0e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
e0f0: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53  pAllCursors(p, S
e100: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
e110: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e120: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
e130: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
e140: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
e150: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
e160: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
e170: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
e180: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
e190: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
e1a0: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
e1b0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e1c0: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
e1d0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
e1e0: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
e1f0: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
e200: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
e210: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
e220: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
e230: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
e240: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e250: 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a  n is commtted..*
e260: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
e270: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
e280: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
e290: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
e2a0: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
e2b0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
e2c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e2d0: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
e2e0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
e2f0: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
e300: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
e310: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e320: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
e330: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
e340: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
e350: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
e360: 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
e370: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
e380: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
e390: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
e3a0: 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
e3b0: 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
e3c0: 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
e3d0: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65   may have occure
e3e0: 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d  d, causing an em
e3f0: 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
e400: 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
e410: 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d  ase (db->nStatem
e420: 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65  ent==0), and the
e430: 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
e440: 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   do..  */.  if( 
e450: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26  db->nStatement &
e460: 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  & p->iStatement 
e470: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
e480: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
e490: 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
e4a0: 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
e4b0: 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
e4c0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
e4d0: 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
e4e0: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
e4f0: 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
e500: 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
e510: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
e520: 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
e530: 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
e540: 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
e550: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
e560: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
e570: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
e580: 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
e590: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e5a0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e5b0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
e5c0: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
e5d0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
e5e0: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
e5f0: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
e600: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
e610: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
e620: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
e630: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e640: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
e650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
e660: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
e670: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
e680: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
e690: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e6b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e6c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e6d0: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
e6e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e6f0: 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
e700: 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
e710: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
e720: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
e730: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
e740: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
e750: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
e760: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
e770: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
e780: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
e790: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
e7a0: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
e7b0: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
e7c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
e7d0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
e7e0: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
e7f0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
e800: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
e810: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
e820: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
e830: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  efCons;.    }.  
e840: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e850: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ../*.** If SQLit
e860: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
e870: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
e880: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
e890: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
e8a0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
e8b0: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
e8c0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
e8d0: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
e8e0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
e8f0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
e900: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
e910: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
e920: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
e930: 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  it.** sets the B
e940: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
e950: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
e960: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
e970: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
e980: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
e990: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
e9a0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
e9b0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
e9c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
e9d0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
e9e0: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
e9f0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
ea00: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
ea10: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ea20: 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  All() is invoked
ea30: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
ea40: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
ea50: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
ea60: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
ea70: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
ea80: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
ea90: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
eaa0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
eab0: 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79  . Of course only
eac0: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
ead0: 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  se structures.**
eae0: 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65   will be accesse
eaf0: 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64  d by the VM, and
eb00: 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64   we could use Vd
eb10: 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20  be.btreeMask to 
eb20: 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73  figure.** that s
eb30: 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74  ubset out, but t
eb40: 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
eb50: 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f  tage to doing so
eb60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
eb70: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
eb80: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
eb90: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
eba0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
ebb0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
ebc0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e  a no-op..*/.#ifn
ebd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebe0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69  SHARED_CACHE.voi
ebf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74  d sqlite3VdbeMut
ec00: 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62  exArrayEnter(Vdb
ec10: 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  e *p){.#if SQLIT
ec20: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73  E_THREADSAFE.  s
ec30: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
ec40: 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61  ArrayEnter(&p->a
ec50: 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20  Mutex);.#else.  
ec60: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
ec70: 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e  rAll(p->db);.#en
ec80: 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  dif.}.#endif../*
ec90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
eca0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
ecb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
ecc0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
ecd0: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
ece0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ecf0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
ed00: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
ed10: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
ed20: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
ed30: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
ed40: 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
ed50: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
ed60: 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
ed70: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
ed80: 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
ed90: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
eda0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
edb0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
edc0: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
edd0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
ede0: 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
edf0: 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
ee00: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
ee10: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
ee20: 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a  RAINT and write.
ee30: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ** an error mess
ee40: 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
ee50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
ee60: 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
ee70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ee80: 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
ee90: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
eea0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
eeb0: 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
eec0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
eed0: 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
eee0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
eef0: 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72  ns>0) || (!defer
ef00: 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
ef10: 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20  straint>0) ){.  
ef20: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ef30: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
ef40: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
ef50: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
ef60: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
ef70: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
ef80: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  , "foreign key c
ef90: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
efa0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
efb0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
efc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
efd0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
efe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
eff0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
f000: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
f010: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
f020: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
f030: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
f040: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
f050: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
f060: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
f070: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
f080: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
f090: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
f0a0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
f0b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
f0c0: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
f0d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
f0e0: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
f0f0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
f100: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
f110: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
f120: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
f130: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
f140: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
f150: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
f160: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
f170: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
f180: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
f190: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
f1a0: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
f1b0: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
f1c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f1d0: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
f1e0: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
f1f0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
f200: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
f210: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
f220: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
f230: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f240: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
f250: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
f280: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
f290: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
f2a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f2b0: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
f2c0: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
f2d0: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
f2e0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
f2f0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
f300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
f310: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
f320: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
f330: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
f340: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
f350: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
f360: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
f370: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
f380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
f390: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
f3a0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
f3b0: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
f3c0: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
f3d0: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
f3e0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
f3f0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
f400: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
f410: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
f420: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
f430: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f440: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
f450: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
f460: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
f470: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
f480: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
f490: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
f4a0: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
f4b0: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
f4c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f4d0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
f4e0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
f4f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
f500: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
f510: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
f520: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
f530: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
f540: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
f550: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f560: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
f570: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
f580: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
f590: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
f5a0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
f5b0: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
f5c0: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
f5d0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
f5e0: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
f5f0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
f600: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
f610: 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
f620: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
f630: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
f650: 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
f660: 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
f670: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
f680: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
f690: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
f6a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f6b0: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72  eMutexArrayEnter
f6c0: 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
f6d0: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
f6e0: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
f6f0: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
f700: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
f710: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
f720: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
f730: 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
f740: 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
f750: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
f760: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
f770: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
f780: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
f790: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
f7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
f7b0: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
f7c0: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
f7d0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
f7e0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
f7f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
f800: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
f810: 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20  d-only, we need 
f820: 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  do no rollback a
f830: 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65  t all. Otherwise
f840: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  ,.      ** proce
f850: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
f860: 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
f870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f880: 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
f890: 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
f8a0: 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
f8b0: 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49    if( (mrc==SQLI
f8c0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
f8d0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
f8e0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
f8f0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
f900: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
f910: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f920: 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  CK;.        }els
f930: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
f940: 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
f950: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
f960: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
f970: 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
f980: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
f990: 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
f9a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
f9b0: 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
f9c0: 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
f9d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f9e0: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
f9f0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
fa00: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
fa10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
fa20: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
fa30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
fa40: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
fa50: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
fa60: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
fa70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fa80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
fa90: 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65  * Check for imme
faa0: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
fab0: 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f  y violations. */
fac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
fad0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
faf0: 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20  eckFk(p, 0);.   
fb00: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
fb10: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
fb20: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
fb30: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
fb40: 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
fb50: 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
fb60: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
fb70: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
fb80: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
fb90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
fba0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
fbb0: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
fbc0: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
fbd0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
fbe0: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
fbf0: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
fc00: 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
fc10: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
fc20: 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
fc30: 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
fc40: 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
fc50: 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
fc60: 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  t==(p->readOnly=
fc70: 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
fc80: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
fc90: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
fca0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
fcb0: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
fcc0: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
fcd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
fce0: 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 20 29  eCheckFk(p, 1) )
fcf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
fd00: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
fd10: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
fd20: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
fd30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fd40: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
fd50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
fd60: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
fd70: 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
fd80: 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
fd90: 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
fda0: 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
fdb0: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
fdc0: 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
fdd0: 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
fde0: 69 67 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  ign.        ** k
fdf0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
fe00: 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
fe10: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
fe20: 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
fe30: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
fe40: 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
fe50: 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
fe60: 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
fe70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fe80: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
fe90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fea0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
feb0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
fec0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
fed0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
fee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
fef0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ff00: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
ff10: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
ff20: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
ff30: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
ff40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ff50: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
ff60: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
ff70: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
ff80: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
ff90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ffa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ffb0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
ffc0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
ffd0: 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
ffe0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
fff0: 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
10000 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
10010 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10020 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
10030 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10040 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
10050 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10060 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
10070 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10080 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10090 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
100a0 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
100b0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
100c0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
100d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61  se{.        inva
100e0 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
100f0 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
10100 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10110 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
10120 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10130 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
10140 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
10150 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10160 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10170 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
10180 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
10190 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
101a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
101b0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
101c0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
101d0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
101e0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
101f0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
10200 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
10210 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
10220 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
10230 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
10240 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
10250 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
10260 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
10270 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
10280 52 41 49 4e 54 2c 20 74 68 65 6e 20 73 65 74 20  RAINT, then set 
10290 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a  the error.    **
102a0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
102b0 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
102c0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
102d0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
102e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
102f0 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
10300 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
10310 20 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70      if( rc && (p
10320 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10330 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
10340 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a  _CONSTRAINT) ){.
10350 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10360 72 63 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rc;.        sqli
10370 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10380 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
10390 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
103a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
103b0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
103c0 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
103d0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
103e0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
103f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
10400 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
10410 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
10420 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
10430 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
10440 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
10450 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
10460 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
10470 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
10480 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
10490 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
104a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
104b0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
104c0 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
104d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
104e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
104f0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
10500 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
10510 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
10520 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
10530 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
10540 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
10550 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
10560 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
10570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
10580 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
10590 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
105a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
105b0 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
105c0 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
105d0 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
105e0 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
105f0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
10600 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
10610 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
10620 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
10630 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
10640 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
10650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
10660 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
10670 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
10680 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
10690 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
106a0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
106b0 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
106c0 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69  VdbeCnt--;.    i
106d0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
106e0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69  ){.      db->wri
106f0 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  teVdbeCnt--;.   
10700 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
10710 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
10720 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  >=db->writeVdbeC
10730 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt );.  }.  p->m
10740 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
10750 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
10760 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
10770 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
10780 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10790 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
107a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
107b0 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
107c0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
107d0 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
107e0 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
107f0 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
10800 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
10810 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
10820 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
10830 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
10840 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
10850 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
10860 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
10870 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
10880 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
10890 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
108a0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
108b0 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
108c0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
108d0 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30  >activeVdbeCnt>0
108e0 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
108f0 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
10900 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
10910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10920 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
10930 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
10940 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
10950 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
10960 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
10970 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
10980 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
10990 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
109a0 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
109b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
109c0 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
109d0 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
109e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
109f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
10a00 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
10a10 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
10a20 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
10a30 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
10a40 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
10a50 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
10a60 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
10a70 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
10a80 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
10a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
10aa0 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
10ab0 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
10ac0 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
10ad0 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
10ae0 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
10af0 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
10b00 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
10b10 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
10b20 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
10b30 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
10b40 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
10b50 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
10b60 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
10b70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10b80 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
10b90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
10ba0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
10bb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
10bc0 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
10bd0 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
10be0 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
10bf0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
10c00 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
10c10 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
10c20 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
10c30 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
10c40 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
10c50 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
10c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10c70 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
10c80 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
10c90 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
10ca0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
10cb0 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
10cc0 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
10cd0 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
10ce0 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
10cf0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
10d00 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
10d10 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
10d20 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
10d30 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
10d40 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
10d50 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
10d60 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
10d70 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
10d80 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
10d90 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
10da0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
10db0 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
10dc0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
10dd0 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
10de0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
10df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
10e00 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
10e10 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
10e20 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
10e30 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
10e40 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
10e50 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
10e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e70 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
10e80 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
10e90 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
10ea0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10eb0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
10ec0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
10ed0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
10ee0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
10ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10f00 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
10f10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10f20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
10f30 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
10f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
10f50 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
10f60 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
10f70 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
10f80 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
10f90 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
10fa0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
10fb0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
10fc0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
10fd0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
10fe0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
10ff0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
11000 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
11010 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
11020 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
11030 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
11040 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
11050 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
11060 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
11070 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
11080 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
11090 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
110a0 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
110b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
110c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
110d0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
110e0 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
110f0 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
11100 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
11110 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
11120 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
11130 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
11140 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
11150 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
11160 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
11170 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
11180 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
11190 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
111a0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
111b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
111c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
111d0 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
111e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
111f0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
11200 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
11210 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
11220 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
11230 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
11240 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
11250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11260 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
11270 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11280 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
11290 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
112a0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
112b0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
112c0 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
112d0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
112e0 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
112f0 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
11300 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
11310 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
11320 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
11330 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
11340 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
11350 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
11360 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11370 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
11380 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
11390 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
113a0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
113b0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
113c0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
113d0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
113e0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
113f0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
11400 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
11410 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
11420 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
11430 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
11440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11450 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
11460 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
11470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11480 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
11490 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
114a0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
114b0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
114c0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
114d0 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
114e0 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
114f0 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
11500 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11510 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
11520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11530 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
11540 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
11550 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
11560 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
11570 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
11580 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
11590 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
115a0 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
115b0 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
115c0 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
115d0 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
115e0 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
115f0 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
11600 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
11610 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
11620 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
11630 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
11640 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
11650 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
11660 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
11670 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
11680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
11690 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
116a0 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
116b0 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
116c0 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
116d0 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29  &(((u32)1)<<i)))
116e0 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
116f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
11700 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
11710 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
11720 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
11730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
11740 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
11750 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11760 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
11770 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
11780 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
11790 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
117a0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
117b0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
117c0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
117d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ->db;.  if( p->p
117e0 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
117f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
11800 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
11810 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11820 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
11830 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
11840 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
11850 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
11860 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
11870 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
11880 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
11890 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
118a0 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  Var);.  releaseM
118b0 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
118c0 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
118d0 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
118e0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
118f0 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
11900 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
11910 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
11920 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
11930 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
11940 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
11950 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11960 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  Sql);.  p->magic
11970 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
11980 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  AD;.  sqlite3DbF
11990 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
119a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
119b0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
119c0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
119d0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
119e0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
119f0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
11a00 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
11a10 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
11a20 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
11a30 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
11a40 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
11a50 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
11a60 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
11a70 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
11a80 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
11a90 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
11aa0 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
11ab0 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
11ac0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
11ad0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
11ae0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
11af0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
11b00 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
11b10 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
11b20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
11b30 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
11b40 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
11b50 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
11b60 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
11b70 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
11b80 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
11b90 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
11ba0 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
11bb0 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
11bc0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
11bd0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
11be0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
11bf0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
11c00 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
11c10 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
11c20 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
11c30 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
11c40 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
11c50 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
11c60 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
11c70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
11c80 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
11c90 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
11ca0 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
11cb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
11cc0 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
11cd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
11ce0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
11cf0 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
11d00 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
11d10 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
11d20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11d30 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
11d40 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
11d50 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  t;.    p->rowidI
11d60 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59 53 28  sValid = ALWAYS(
11d70 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20  res==0) ?1:0;.  
11d80 20 20 69 66 28 20 4e 45 56 45 52 28 72 65 73 3c    if( NEVER(res<
11d90 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  0) ){.      rc =
11da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
11db0 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
11dc0 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
11dd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11de0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
11df0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
11e00 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
11e10 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
11e20 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
11e30 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
11e40 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
11e50 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
11e60 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43  if( ALWAYS(p->pC
11e70 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e  ursor) ){.    in
11e80 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
11e90 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
11ea0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
11eb0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
11ec0 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
11ed0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11ee0 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
11ef0 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
11f00 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
11f10 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
11f20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
11f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11f50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
11f60 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
11f70 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
11f80 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
11f90 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
11fa0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
11fb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11fc0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
11fd0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
11fe0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
11ff0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
12000 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
12010 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
12020 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
12030 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
12040 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
12050 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
12060 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
12070 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
12080 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
12090 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
120a0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
120b0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
120c0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
120d0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
120e0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
120f0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
12100 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
12110 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
12120 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
12130 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
12140 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
12150 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
12160 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
12170 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
12180 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
12190 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
121a0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
121b0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
121c0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
121d0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
121e0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
121f0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
12200 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
12210 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
12220 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
12230 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
12240 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
12250 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
12260 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
12270 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
12280 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
12290 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
122a0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
122b0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
122c0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
122d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
122e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
122f0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
12300 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
12310 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
12320 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
12330 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
12340 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12350 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12360 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
12370 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
12380 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12390 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
123c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
123d0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
123e0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
123f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
12400 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
12430 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
12440 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
12460 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
12470 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
12480 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
12490 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
124a0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
124b0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
124d0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
124e0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
124f0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
12500 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
12510 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
12520 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
12530 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
12560 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
12570 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
12580 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
12590 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
125a0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
125b0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
125c0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
125d0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
125e0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
125f0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
12600 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
12610 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
12620 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
12630 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
12640 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
12650 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
12660 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
12670 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
12680 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
12690 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
126a0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
126b0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
126c0 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
126d0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
126e0 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
126f0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
12700 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
12710 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
12720 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
12730 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
12740 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
12750 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
12760 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
12770 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
12780 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
12790 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
127a0 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
127b0 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
127c0 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
127d0 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
127e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
127f0 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20  +(u32)i;.    }. 
12800 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
12810 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
12820 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
12830 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
12840 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
12850 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
12860 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
12870 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
12880 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
12890 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
128a0 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
128b0 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
128c0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
128d0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
128e0 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
128f0 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
12900 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
12910 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
12920 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
12930 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
12940 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
12950 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
12960 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
12970 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
12980 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
12990 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
129a0 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
129b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
129c0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
129d0 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
129e0 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
129f0 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
12a00 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
12a10 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12a20 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
12a30 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
12a40 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
12a50 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
12a60 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
12a70 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
12a80 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
12a90 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
12aa0 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
12ab0 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
12ac0 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
12ad0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
12ae0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
12af0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
12b00 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
12b10 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
12b20 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
12b30 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
12b40 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
12b50 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
12b60 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
12b70 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
12b80 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
12b90 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
12ba0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
12bb0 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
12bc0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
12bd0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
12be0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
12bf0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
12c00 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
12c10 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
12c20 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
12c30 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
12c40 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
12c50 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
12c60 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
12c70 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
12c80 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
12c90 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
12ca0 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
12cb0 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
12cc0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
12cd0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
12ce0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
12cf0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
12d00 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
12d10 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
12d20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
12d30 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
12d40 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
12d50 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
12d60 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
12d70 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
12d80 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
12d90 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
12da0 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
12db0 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
12dc0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
12dd0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
12de0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
12df0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
12e00 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
12e10 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
12e20 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
12e30 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
12e40 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
12e50 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
12e60 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
12e70 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
12e80 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
12e90 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
12ea0 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
12eb0 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
12ec0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
12ed0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
12ee0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
12ef0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
12f00 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
12f10 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
12f20 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
12f30 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
12f40 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
12f50 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
12f60 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
12f70 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
12f80 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
12f90 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
12fa0 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
12fb0 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
12fc0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
12fd0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
12fe0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
12ff0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
13000 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
13010 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
13020 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
13030 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
13040 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
13050 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
13060 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
13070 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
13080 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
13090 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
130a0 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
130b0 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
130c0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
130d0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
130e0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
130f0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
13100 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
13110 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
13120 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
13130 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
13140 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
13150 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
13160 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
13170 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
13180 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
13190 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
131a0 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
131b0 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
131c0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
131d0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
131e0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
131f0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
13200 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
13210 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
13220 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
13230 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13240 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
13250 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
13260 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
13270 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
13280 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
13290 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
132a0 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
132b0 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
132c0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
132d0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
132e0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
132f0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13300 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
13310 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
13320 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
13330 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
13340 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
13350 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
13360 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
13370 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
13380 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
13390 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
133a0 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
133b0 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
133c0 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
133d0 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
133e0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
133f0 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
13400 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
13410 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
13420 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
13430 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
13440 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
13450 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
13460 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
13470 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
13480 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
13490 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
134a0 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
134b0 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
134c0 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
134d0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
134e0 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
134f0 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
13500 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
13510 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
13520 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
13530 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
13540 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13550 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
13560 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
13570 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
13580 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
13590 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
135a0 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
135b0 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
135c0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
135d0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
135e0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
135f0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
13600 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
13610 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
13620 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
13630 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
13640 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
13650 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
13660 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
13670 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
13680 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
13690 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
136a0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
136b0 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
136c0 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
136d0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
136e0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
136f0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
13700 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13710 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
13720 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
13730 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
13740 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
13750 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
13760 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
13770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
13780 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
13790 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
137a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
137b0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
137c0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
137d0 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
137e0 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
137f0 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
13800 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
13810 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
13820 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
13830 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
13840 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
13850 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
13860 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
13870 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
13880 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
13890 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
138a0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
138b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
138c0 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
138d0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
138e0 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
138f0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
13900 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
13910 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
13920 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
13930 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
13940 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
13950 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
13960 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
13970 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
13980 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
13990 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
139a0 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
139b0 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
139c0 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
139d0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
139e0 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
139f0 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
13a00 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13a10 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
13a20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
13a30 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
13a40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13a50 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
13a60 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
13a70 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
13a80 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
13a90 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
13aa0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
13ab0 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
13ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13ad0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
13ae0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
13af0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
13b00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13b10 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
13b20 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
13b30 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
13b40 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
13b60 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
13b70 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
13b80 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
13ba0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
13bb0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
13bc0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
13bd0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
13be0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
13bf0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
13c00 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
13c10 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
13c20 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
13c30 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
13c40 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
13c50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
13c60 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
13c70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c80 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
13c90 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
13ca0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
13cb0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
13cc0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
13cd0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
13ce0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
13cf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
13d00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
13d10 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
13d20 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
13d30 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
13d40 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
13d50 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
13d60 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
13d70 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
13d80 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
13d90 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
13da0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
13db0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
13dc0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
13dd0 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
13de0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
13df0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
13e00 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
13e10 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13e20 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13e30 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
13e40 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
13e50 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13e60 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
13e70 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
13e80 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
13e90 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
13ea0 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
13eb0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
13ec0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
13ed0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
13ee0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
13ef0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
13f00 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
13f10 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
13f20 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
13f30 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
13f40 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
13f50 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
13f60 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
13f70 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
13f80 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
13f90 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
13fa0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
13fb0 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
13fc0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
13fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
13fe0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
13ff0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
14000 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14010 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
14020 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
14030 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
14040 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
14050 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
14060 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
14070 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
14080 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
14090 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
140a0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
140b0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
140c0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
140d0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
140e0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
140f0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
14100 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
14110 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
14120 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
14130 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
14140 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
14150 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
14160 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
14170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
14180 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
14190 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
141a0 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
141b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
141c0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
141d0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
141e0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
141f0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
14200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14210 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
14220 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
14230 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
14240 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
14250 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
14260 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
14270 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
14280 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
14290 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
142a0 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
142b0 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
142c0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
142d0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
142e0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
142f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
14300 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
14310 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
14320 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
14330 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14340 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
14360 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
14370 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
14380 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
14390 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
143a0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
143b0 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
143c0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
143d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
143e0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
143f0 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
14400 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
14410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14420 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
14430 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
14440 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
14450 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
14460 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
14470 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
14480 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
14490 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
144a0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
144b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
144c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
144d0 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
144e0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
144f0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
14500 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
14510 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
14520 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
14530 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
14540 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14550 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
14560 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14570 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
14580 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
14590 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
145a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
145b0 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
145c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
145d0 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
145e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
145f0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
14600 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
14610 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
14620 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
14630 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
14640 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
14650 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
14660 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
14670 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
14680 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
14690 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
146a0 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
146b0 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
146c0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
146d0 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
146e0 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
146f0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
14700 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
14710 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
14720 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
14730 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
14740 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
14750 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
14760 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
14770 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
14780 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
14790 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
147a0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
147b0 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
147c0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
147d0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
147e0 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
147f0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
14800 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
14810 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
14820 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
14830 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
14840 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
14850 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
14860 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
14870 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
14880 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
14890 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
148a0 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
148b0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
148c0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
148d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
148e0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
148f0 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74  ilable to hold t
14900 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  he object */.  i
14910 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
14920 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14930 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
14940 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
14950 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14960 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
14970 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
14980 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
14990 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65  cord *p;  /* The
149a0 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
149b0 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65   that we will re
149c0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
149d0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  yte;          /*
149e0 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65   Memory space ne
149f0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20  eded to hold p, 
14a00 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
14a10 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  t d;.  u32 idx;.
14a20 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
14a30 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
14a40 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
14a50 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
14a60 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
14a70 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
14a80 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53    /* Increase pS
14a90 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63  pace by this muc
14aa0 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67  h to 8-byte alig
14ab0 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a  n it */.  .  /*.
14ac0 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    ** We want to 
14ad0 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
14ae0 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
14af0 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
14b00 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
14b10 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
14b20 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
14b30 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
14b40 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
14b50 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
14b60 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
14b70 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
14b80 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
14b90 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
14ba0 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
14bb0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
14bc0 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
14bd0 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b   & 7;.  pSpace +
14be0 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63  = nOff;.  szSpac
14bf0 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79  e -= nOff;.  nBy
14c00 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
14c10 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
14c20 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
14c30 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
14c40 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
14c50 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
14c60 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
14c70 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
14c80 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
14c90 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
14ca0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
14cb0 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
14cc0 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
14cd0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14ce0 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
14cf0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
14d00 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20  cord*)pSpace;.  
14d10 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
14d20 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
14d30 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65  OY;.  }.  p->pKe
14d40 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
14d50 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
14d60 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
14d70 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   + 1;.  p->aMem 
14d80 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  = pMem = (Mem*)&
14d90 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
14da0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
14db0 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
14dc0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
14dd0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
14de0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
14df0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
14e00 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
14e10 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
14e20 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
14e30 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
14e40 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
14e50 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
14e60 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
14e70 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
14e80 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
14e90 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
14ea0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
14eb0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
14ec0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
14ed0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14ee0 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d   0;.    pMem->zM
14ef0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
14f00 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
14f10 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
14f20 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
14f30 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
14f40 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a  +;.    u++;.  }.
14f50 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
14f60 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
14f70 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
14f80 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28   = u;.  return (
14f90 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  void*)p;.}../*.*
14fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
14fb0 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b  estroys a Unpack
14fc0 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e  edRecord object.
14fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14fe0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
14ff0 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65  edRecord(Unpacke
15000 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
15010 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  nt i;.  Mem *pMe
15020 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  m;..  assert( p!
15030 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15040 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
15050 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15060 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
15070 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70  Mem=p->aMem; i<p
15080 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70  ->nField; i++, p
15090 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54  Mem++){.    /* T
150a0 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
150b0 72 64 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e  rd is always con
150c0 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 0a  structed by the.
150d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
150e0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
150f0 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c   function above,
15100 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c   which makes all
15110 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
15120 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63  and blobs static
15130 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  .  And none of t
15140 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a  he elements are.
15150 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e      ** ever tran
15160 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72  sformed, so ther
15170 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
15180 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20  ing to delete.. 
15190 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
151a0 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  VER(pMem->zMallo
151b0 63 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  c) ) sqlite3Vdbe
151c0 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
151d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66  ;.  }.  if( p->f
151e0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
151f0 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20  NEED_FREE ){.   
15200 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15210 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
15220 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
15230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
15240 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
15250 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
15260 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
15270 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
15280 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
15290 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
152a0 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
152b0 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
152c0 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
152d0 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
152e0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
152f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
15300 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
15310 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
15320 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
15330 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
15340 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
15350 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
15360 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
15370 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
15380 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
15390 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
153a0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
153b0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
153c0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
153d0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
153e0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
153f0 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
15400 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
15410 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
15420 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
15430 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
15440 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
15450 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
15460 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
15470 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
15480 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
15490 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
154a0 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
154b0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
154c0 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
154d0 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
154e0 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
154f0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
15500 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
15510 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
15520 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
15530 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
15540 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
15550 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
15560 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
15570 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
15580 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  e UNPACKED_IGNOR
15590 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20  E_ROWID flag is 
155a0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  set, then the la
155b0 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
155c0 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79  e header of pKey
155d0 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49  1 is ignored.  I
155e0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
155f0 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e  t pKey1 is.** an
15600 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20   index key, and 
15610 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20 61  thus ends with a
15620 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54   rowid value.  T
15630 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20  he last byte.** 
15640 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77 69  of the header wi
15650 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
15660 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
15670 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a  of the rowid:.**
15680 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c   one of 1, 2, 3,
15690 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20   4, 5, 6, 8, or 
156a0 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20  9 - the integer 
156b0 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a  serial types..**
156c0 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
156d0 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   of the final ro
156e0 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  wid will always 
156f0 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  be a single byte
15700 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67  ..** By ignoring
15710 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65 20   this last byte 
15720 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20 77  of the header, w
15730 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70  e force the comp
15740 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e  arison.** to ign
15750 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61 74  ore the rowid at
15760 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31   the end of key1
15770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15780 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
15790 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
157a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
157b0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
157c0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
157d0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
157e0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
157f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20  /.){.  int d1;  
15800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
15810 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
15820 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
15830 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
15840 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
15850 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
15860 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
15870 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
15880 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
15890 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
158a0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
158b0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
158c0 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
158d0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
158e0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
158f0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
15900 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15910 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
15920 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
15930 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
15940 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
15950 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
15960 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
15970 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
15980 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
15990 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
159a0 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
159b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
159c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
159d0 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
159e0 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  NLY( mem1.zMallo
159f0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
15a00 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
15a10 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
15a20 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
15a30 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
15a40 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
15a50 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
15a60 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
15a70 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
15a80 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
15a90 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
15aa0 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
15ab0 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
15ac0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
15ad0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
15ae0 6c 79 20 62 65 20 75 73 65 64 20 69 6e 69 74 69  ly be used initi
15af0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
15b00 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
15b10 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
15b20 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
15b30 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
15b40 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
15b50 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
15b60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15b70 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
15b80 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
15b90 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
15ba0 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
15bb0 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
15bc0 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
15bd0 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
15be0 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
15bf0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
15c00 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
15c10 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
15c20 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
15c30 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
15c40 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
15c50 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
15c60 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b  zHdr1;.  if( pPK
15c70 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
15c80 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
15c90 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31  ID ){.    szHdr1
15ca0 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64  --;.  }.  nField
15cb0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
15cc0 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
15cd0 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
15ce0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b  PKey2->nField ){
15cf0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
15d00 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
15d10 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
15d20 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
15d30 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
15d40 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
15d50 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
15d60 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
15d70 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20  erial_type1 );. 
15d80 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31     if( d1>=nKey1
15d90 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
15da0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
15db0 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62  ial_type1)>0 ) b
15dc0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  reak;..    /* Ex
15dd0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
15de0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
15df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
15e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15e10 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
15e20 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
15e30 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
15e40 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
15e50 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
15e60 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
15e70 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
15e80 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20  ey2->aMem[i],.  
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c           i<nFiel
15eb0 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
15ec0 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
15ed0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
15ee0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
15ef0 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  .zMalloc==0 );  
15f00 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
15f10 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  elow */..      /
15f20 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
15f30 75 6c 74 20 69 66 20 77 65 20 61 72 65 20 75 73  ult if we are us
15f40 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72  ing DESC sort or
15f50 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  der. */.      if
15f60 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
15f70 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65  tOrder && i<nFie
15f80 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld && pKeyInfo->
15f90 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
15fa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
15fb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a  c;.      }.    .
15fc0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15fd0 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
15fe0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c  ag is set and al
15ff0 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20  l fields except 
16000 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20  the final.      
16010 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77  ** rowid field w
16020 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  ere equal, then 
16030 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58  clear the PREFIX
16040 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64  _SEARCH flag and
16050 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70   set .      ** p
16060 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20  PKey2->rowid to 
16070 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16080 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20   rowid field in 
16090 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a  (pKey1, nKey1)..
160a0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
160b0 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
160c0 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e  IsUnique opcode.
160d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
160e0 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61  if( (pPKey2->fla
160f0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
16100 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20  EFIX_SEARCH) && 
16110 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65  i==(pPKey2->nFie
16120 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ld-1) ){.       
16130 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73   assert( idx1==s
16140 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20  zHdr1 && rc );. 
16150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
16160 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em1.flags & MEM_
16170 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Int );.        p
16180 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20  PKey2->flags &= 
16190 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58  ~UNPACKED_PREFIX
161a0 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20  _SEARCH;.       
161b0 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d   pPKey2->rowid =
161c0 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20   mem1.u.i;.     
161d0 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65   }.    .      re
161e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
161f0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
16200 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
16210 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
16220 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
16230 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
16240 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
16250 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
16260 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
16270 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
16280 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
16290 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
162a0 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
162b0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
162c0 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
162d0 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
162e0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
162f0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
16300 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
16310 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
16320 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
16330 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
16340 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
16350 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
16360 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16370 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  Y.  ** flag is s
16380 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74  et, then break t
16390 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69  he tie by treati
163a0 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65  ng key2 as large
163b0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55  r..  ** If the U
163c0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
163d0 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
163e0 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
163f0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
16400 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65    ** are conside
16410 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e  red to be equal.
16420 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
16430 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74   longer key is t
16440 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e  he .  ** larger.
16450 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c    As it happens,
16460 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c   the pPKey2 will
16470 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c   always be the l
16480 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68  onger.  ** if th
16490 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
164a0 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nce..  */.  asse
164b0 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69  rt( rc==0 );.  i
164c0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
164d0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
164e0 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KEY ){.    rc = 
164f0 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  -1;.  }else if( 
16500 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
16510 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
16520 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20  MATCH ){.    /* 
16530 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20  Leave rc==0 */. 
16540 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c   }else if( idx1<
16550 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63  szHdr1 ){.    rc
16560 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
16570 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a  rn rc;.}. ../*.*
16580 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
16590 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
165a0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
165b0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
165c0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
165d0 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
165e0 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
165f0 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
16600 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
16610 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
16620 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
16630 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
16640 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
16650 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
16660 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
16670 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
16680 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
16690 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
166a0 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
166b0 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
166c0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
166d0 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
166e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
166f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16700 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
16710 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
16720 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
16730 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
16740 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
16750 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
16760 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16770 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
16780 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
16790 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
167a0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
167b0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
167c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
167d0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
167e0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53  em m, v;..  UNUS
167f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
16800 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
16810 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
16820 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
16830 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
16840 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
16850 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
16860 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
16870 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
16880 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16890 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
168a0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
168b0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
168c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
168d0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
168e0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
168f0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
16900 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
16910 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
16920 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
16930 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
16940 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
16950 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
16960 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
16970 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
16980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
16990 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
169a0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
169b0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
169c0 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
169d0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
169e0 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
169f0 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
16a00 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
16a10 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
16a20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
16a30 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  try */.  memset(
16a40 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
16a50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16a60 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
16a70 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  e(pCur, 0, (int)
16a80 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
16a90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16aa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16ab0 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
16ac0 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
16ad0 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
16ae0 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
16af0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
16b00 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
16b10 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
16b20 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
16b30 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
16b40 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
16b50 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
16b60 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
16b70 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
16b80 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
16b90 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
16ba0 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
16bb0 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
16bc0 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
16bd0 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
16be0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
16bf0 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
16c00 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
16c10 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
16c20 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
16c30 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
16c40 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
16c50 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
16c60 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
16c70 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
16c80 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
16c90 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
16ca0 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
16cb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
16cc0 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
16cd0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
16ce0 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
16cf0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
16d00 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
16d10 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
16d20 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
16d30 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
16d40 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
16d50 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
16d60 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
16d70 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
16d80 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
16d90 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16da0 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
16db0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
16dc0 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
16dd0 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
16de0 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
16df0 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
16e00 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
16e10 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
16e20 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
16e30 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
16e40 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
16e50 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
16e60 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
16e70 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
16e80 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
16e90 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
16ea0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
16eb0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
16ec0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
16ed0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
16ee0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
16ef0 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
16f00 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
16f10 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
16f20 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
16f30 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
16f40 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
16f50 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
16f60 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
16f70 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
16f80 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
16f90 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  .zMalloc!=0 );. 
16fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
16fb0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
16fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
16fd0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
16fe0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
16ff0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
17000 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
17010 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
17020 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
17030 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
17040 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
17050 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
17060 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
17070 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
17080 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
17090 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
170a0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
170b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
170c0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
170d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
170e0 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
170f0 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
17100 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
17110 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
17120 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
17130 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
17140 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
17150 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
17160 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17170 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
17180 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
17190 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
171a0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
171b0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
171c0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
171d0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
171e0 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
171f0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
17200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17210 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
17220 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  e(.  VdbeCursor 
17230 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
17240 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
17250 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
17260 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
17270 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
17280 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ,  /* Unpacked v
17290 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f  ersion of key to
172a0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
172b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
172e0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
172f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
17300 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
17310 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
17320 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
17330 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
17340 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
17350 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17360 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17370 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17380 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
17390 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
173a0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
173b0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
173c0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
173d0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
173e0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
173f0 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
17400 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
17410 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
17420 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
17430 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74  he say.  ** that
17440 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
17450 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
17460 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
17470 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
17480 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
17490 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
174a0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
174b0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
174c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
174d0 52 55 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  RUPT;.  }.  mems
174e0 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
174f0 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
17500 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
17510 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
17520 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  , 0, (int)nCellK
17530 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
17540 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
17550 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
17560 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e  ert( pUnpacked->
17570 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17580 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b  _IGNORE_ROWID );
17590 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
175a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
175b0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
175c0 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
175d0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
175e0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
175f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17600 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17610 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
17620 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
17630 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
17640 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
17650 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
17660 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17670 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
17680 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
17690 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
176a0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
176b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
176c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
176d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
176e0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
176f0 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
17700 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
17710 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
17720 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
17730 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
17740 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
17750 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
17760 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
17770 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
17780 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
17790 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
177a0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
177b0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
177c0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
177d0 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
177e0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
177f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
17800 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
17810 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
17820 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
17830 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
17840 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
17850 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
17860 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
17870 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
17880 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
17890 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
178a0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
178b0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
178c0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
178d0 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
178e0 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
178f0 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
17900 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
17910 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
17920 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
17930 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
17940 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
17950 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
17960 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
17970 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
17980 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
17990 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
179a0 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
179b0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
179c0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
179d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
179e0 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
179f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17a00 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
17a10 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
17a20 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
17a30 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
17a40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17a50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
17a60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
17a70 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
17a80 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
17a90 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
17aa0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
17ab0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
17ac0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
17ad0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
17ae0 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
17af0 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
17b00 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
17b10 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
17b20 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
17b30 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
17b40 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
17b50 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
17b60 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
17b70 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
17b80 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
17b90 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
17ba0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
17bb0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
17bc0 64 62 65 47 65 74 56 61 6c 75 65 28 56 64 62 65  dbeGetValue(Vdbe
17bd0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
17be0 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
17bf0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
17c00 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
17c10 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
17c20 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28  iVar-1];.    if(
17c30 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
17c40 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
17c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
17c60 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
17c70 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
17c80 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
17c90 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
17ca0 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
17cb0 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
17cc0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
17cd0 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
17ce0 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
17cf0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
17d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17d10 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
17d20 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20  (Mem *)pRet);.  
17d30 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
17d40 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
17d50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17d60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
17d70 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
17d80 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
17d90 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
17da0 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
17db0 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
17dc0 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
17dd0 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
17de0 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
17df0 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
17e00 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
17e10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
17e20 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
17e30 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
17e40 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
17e50 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
17e60 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
17e70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
17e80 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
17e90 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
17ea0 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
17eb0 29 29 3b 0a 20 20 7d 0a 7d 0a                    ));.  }.}.