/ Hex Artifact Content
Login

Artifact cc95d80b899b75829cb93d260d3f14125a5c26ad:


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 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0f60: 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 69 66  xpired = 0;.  if
0f70: 28 20 6f 70 3d 3d 4f 50 5f 50 61 72 73 65 53 63  ( op==OP_ParseSc
0f80: 68 65 6d 61 20 29 7b 0a 20 20 20 20 2f 2a 20 41  hema ){.    /* A
0f90: 6e 79 20 70 72 6f 67 72 61 6d 20 74 68 61 74 20  ny program that 
0fa0: 75 73 65 73 20 74 68 65 20 4f 50 5f 50 61 72 73  uses the OP_Pars
0fb0: 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 20 6e  eSchema opcode n
0fc0: 65 65 64 73 20 74 6f 20 6c 6f 63 6b 0a 20 20 20  eeds to lock.   
0fd0: 20 2a 2a 20 61 6c 6c 20 62 74 72 65 65 73 2e 20   ** all btrees. 
0fe0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  */.    int j;.  
0ff0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
1000: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71  db->nDb; j++) sq
1010: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1020: 65 65 28 70 2c 20 6a 29 3b 0a 20 20 7d 0a 23 69  ee(p, j);.  }.#i
1030: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1040: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
1050: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
1060: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
1070: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
1080: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
1090: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
10a0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
10b0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
10c0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
10d0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
10e0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
10f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1100: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1110: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1130: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1140: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1150: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1160: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1170: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1190: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
11a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
11b0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
11c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
11d0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
11e0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
11f0: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1200: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1210: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1220: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1230: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1240: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1260: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1280: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
1290: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
12a0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
12b0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
12c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
12d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12e0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
12f0: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1310: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1320: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1330: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1340: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1350: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1360: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1370: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1380: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
1390: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
13a0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
13b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
13c0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
13d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13e0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
13f0: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1400: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1410: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1420: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1430: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1440: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
1450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1460: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1470: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1480: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1490: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
14a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
14b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14c0: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
14d0: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
14e0: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
14f0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1500: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
1510: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
1520: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1540: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1550: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
1560: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1570: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1580: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1590: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15a0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
15b0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
15c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15d0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
15e0: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
15f0: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1600: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1610: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1620: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1630: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1640: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1650: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1660: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1670: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1680: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1690: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
16a0: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
16b0: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
16c0: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
16d0: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
16e0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
16f0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1700: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1710: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1720: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1730: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1740: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1750: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1760: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1770: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1780: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
17a0: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
17b0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
17c0: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
17d0: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
17e0: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
17f0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1800: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1810: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1820: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1830: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1840: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1850: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1860: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1870: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1880: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1890: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18a0: 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  bel(Vdbe *p){.  
18b0: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e  int i;.  i = p->
18c0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
18d0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
18e0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
18f0: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61  .  if( i>=p->nLa
1900: 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  belAlloc ){.    
1910: 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65  int n = p->nLabe
1920: 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20  lAlloc*2 + 5;.  
1930: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71    p->aLabel = sq
1940: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1950: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
1960: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2a                n*
1990: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
19a0: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c  [0]));.    p->nL
19b0: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  abelAlloc = sqli
19c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
19d0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
19e0: 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )/sizeof(p->aLab
19f0: 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  el[0]);.  }.  if
1a00: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
1a10: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
1a20: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1a30: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
1a40: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
1a50: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
1a60: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
1a70: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
1a80: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
1a90: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
1aa0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
1ab0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
1ac0: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
1ad0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
1ae0: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
1af0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1b00: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
1b10: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69   *p, int x){.  i
1b20: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1b30: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1b40: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1b50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
1b60: 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65  =0 && j<p->nLabe
1b70: 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  l );.  if( p->aL
1b80: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1b90: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f  Label[j] = p->nO
1ba0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1bb0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
1bc0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
1bd0: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
1be0: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1bf0: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
1c00: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
1c10: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
1c20: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
1c30: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
1c40: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1c50: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
1c60: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1c70: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
1c80: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
1c90: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1ca0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
1cb0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
1cc0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
1cd0: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
1ce0: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
1cf0: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
1d00: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
1d10: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
1d20: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
1d30: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
1d40: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
1d50: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
1d60: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
1d70: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
1d80: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
1d90: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
1dc0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
1dd0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
1de0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
1df0: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
1e00: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
1e10: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
1e20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e30: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
1e40: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
1e50: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
1e60: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
1e70: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
1e80: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
1e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
1eb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1ec0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
1ed0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
1ee0: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
1ef0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
1f00: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
1f10: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
1f20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f30: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
1f40: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
1f50: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
1f60: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1f70: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
1f80: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
1f90: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
1fc0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
1fd0: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
1fe0: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
1ff0: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2000: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2010: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2020: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
2030: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
2040: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
2050: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
2060: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2070: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2080: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2090: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
20a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
20b0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
20c0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
20d0: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
20e0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
20f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2100: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
2110: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
2120: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
2130: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
2140: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
2150: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
2160: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
2170: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
2180: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
2190: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
21a0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
21b0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
21c0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
21d0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
21e0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
21f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2200: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
2210: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
2220: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
2230: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
2240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2250: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
2260: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
2270: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
2280: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
2290: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
22a0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
22b0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
22c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
22d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22e0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
22f0: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2300: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
2310: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
2320: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2330: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
2340: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
2350: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
2360: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
2370: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2380: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
2390: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
23a0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
23b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
23c0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
23d0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
23e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
23f0: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2400: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2410: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2420: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
2430: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
2440: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2450: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
2460: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2470: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2480: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2490: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
24a0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
24b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
24c0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
24d0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
24e0: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
24f0: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2500: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2510: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2520: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
2530: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2540: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
2550: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
2560: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
2570: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
2580: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2590: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
25a0: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
25b0: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
25c0: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
25d0: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
25e0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
25f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2600: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2610: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2620: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
2630: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
2640: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
2650: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
2660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
2670: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
2680: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2690: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
26a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
26b0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
26c0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
26d0: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
26e0: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70  sAbort = 0;.  Op
26f0: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
2700: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
2710: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2720: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
2730: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
2740: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2750: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2760: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
2770: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2780: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
2790: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
27a0: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
27b0: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
27c0: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23  e==OP_VRename .#
27d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27e0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
27f0: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d      || (opcode==
2800: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
2810: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
2820: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69  p->p2==1) .#endi
2830: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  f.     || ((opco
2840: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
2850: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
2860: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
2870: 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45  (pOp->p1==SQLITE
2880: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2890: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
28a0: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
28b0: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
28c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
28e0: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
28f0: 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20  r.apSub);..  /* 
2900: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68  Return true if h
2910: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
2920: 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f  t. Or if a mallo
2930: 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  c failure occure
2940: 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f  d..  ** If mallo
2950: 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74  c failed, then t
2960: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20  he while() loop 
2970: 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61  above may not ha
2980: 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a  ve iterated.  **
2990: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
29a0: 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72  odes and hasAbor
29b0: 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63  t may be set inc
29c0: 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e  orrectly. Return
29d0: 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74  .  ** true for t
29e0: 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76  his case to prev
29f0: 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29  ent the assert()
2a00: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20   in the callers 
2a10: 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  frame.  ** from 
2a20: 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72  failing.  */.  r
2a30: 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d  eturn ( v->db->m
2a40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68  allocFailed || h
2a50: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
2a60: 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  t );.}.#endif /*
2a70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
2a80: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
2a90: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
2aa0: 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  tion */../*.** L
2ab0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
2ac0: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
2ad0: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
2ae0: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
2af0: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
2b00: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
2b10: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
2b20: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
2b30: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
2b40: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
2b50: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
2b60: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
2b70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2b80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2b90: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
2ba0: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
2bb0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
2bc0: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
2bd0: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
2be0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
2bf0: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
2c00: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
2c10: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
2c20: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
2c30: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
2c40: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
2c50: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
2c60: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
2c70: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
2c80: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
2c90: 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66  The Op.opflags f
2ca0: 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61  ield is set on a
2cb0: 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73  ll opcodes..*/.s
2cc0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
2cd0: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
2ce0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
2cf0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
2d00: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
2d10: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
2d20: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e  .  Op *pOp;.  in
2d30: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61  t *aLabel = p->a
2d40: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
2d50: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Only = 1;.  for(
2d60: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
2d70: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
2d80: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
2d90: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
2da0: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70  opcode;..    pOp
2db0: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
2dc0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
2dd0: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
2de0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75  f( opcode==OP_Fu
2df0: 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65  nction || opcode
2e00: 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a  ==OP_AggStep ){.
2e10: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2e20: 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  5>nMaxArgs ) nMa
2e30: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b  xArgs = pOp->p5;
2e40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
2e50: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73  opcode==OP_Trans
2e60: 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70  action && pOp->p
2e70: 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d  2!=0) || opcode=
2e80: 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20  =OP_Vacuum ){.  
2e90: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
2ea0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
2eb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2ec0: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
2ed0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2ee0: 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Update ){.      
2ef0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
2f00: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2f10: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d  = pOp->p2;.    }
2f20: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2f30: 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20  =OP_VFilter ){. 
2f40: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
2f50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
2f60: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
2f70: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
2f80: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
2f90: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e  teger );.      n
2fa0: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
2fb0: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
2fc0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2fd0: 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   n;.#endif.    }
2fe0: 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e  ..    if( (pOp->
2ff0: 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f  opflags & OPFLG_
3000: 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d  JUMP)!=0 && pOp-
3010: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  >p2<0 ){.      a
3020: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
3030: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
3040: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61       pOp->p2 = a
3050: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
3060: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
3070: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
3080: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
3090: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
30a0: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
30b0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a  s = nMaxArgs;.}.
30c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30d0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
30e0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
30f0: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
3100: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3110: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3120: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
3130: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3140: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3150: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3170: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3180: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3190: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
31a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
31b0: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
31c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
31d0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
31e0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
31f0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
3200: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
3210: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
3220: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
3230: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
3240: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
3250: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
3260: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
3270: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
3280: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
3290: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
32a0: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
32b0: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
32c0: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
32d0: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
32e0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
32f0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
3300: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
3310: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
3320: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
3330: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
3340: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
3350: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
3360: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
3370: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
3380: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
3390: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
33a0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
33b0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
33c0: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
33d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
33e0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
33f0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
3400: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
3410: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
3420: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
3430: 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d  ( p->btreeMask==
3440: 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  0 );..  resolveP
3450: 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78  2Values(p, pnMax
3460: 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20  Arg);.  *pnOp = 
3470: 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70  p->nOp;.  p->aOp
3480: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61   = 0;.  return a
3490: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
34a0: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
34b0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
34c0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
34d0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
34e0: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
34f0: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
3500: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
3510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3520: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
3530: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
3540: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
3550: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
3560: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3570: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3580: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
3590: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
35a0: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
35b0: 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  y(p) ){.    retu
35c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
35d0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
35e0: 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29   ALWAYS(nOp>0) )
35f0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
3600: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
3610: 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20  t *pIn = aOp;.  
3620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
3630: 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20  ; i++, pIn++){. 
3640: 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49       int p2 = pI
3650: 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62  n->p2;.      Vdb
3660: 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e  eOp *pOut = &p->
3670: 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20  aOp[i+addr];.   
3680: 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20     pOut->opcode 
3690: 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pIn->opcode;. 
36a0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20       pOut->p1 = 
36b0: 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69  pIn->p1;.      i
36c0: 66 28 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69  f( p2<0 && (sqli
36d0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
36e0: 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20  y[pOut->opcode] 
36f0: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
3700: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74   ){.        pOut
3710: 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44  ->p2 = addr + AD
3720: 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65  DR(p2);.      }e
3730: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  lse{.        pOu
3740: 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20  t->p2 = p2;.    
3750: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
3760: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
3770: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
3780: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
3790: 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20       pOut->p4.p 
37a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 0;.      pOut-
37b0: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
37c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
37d0: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
37e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
37f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
3800: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
3810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
3820: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
3830: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
3840: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
3850: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
3860: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
3870: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
3880: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3890: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
38a0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
38b0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
38c0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
38d0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
38e0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
38f0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
3900: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
3910: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
3920: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
3930: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
3940: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
3950: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
3960: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
3970: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3980: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
3990: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
39a0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
39b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
39c0: 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28  addr>=0 );.  if(
39d0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a   p->nOp>addr ){.
39e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
39f0: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
3a00: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a10: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3a20: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
3a30: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3a40: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3a50: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3a60: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
3a70: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
3a80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3a90: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
3aa0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3ab0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3ac0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3ad0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
3ae0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3af0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3b00: 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b  [addr].p2 = val;
3b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3b20: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3b30: 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64  f the P3 operand
3b40: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3b50: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3b60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b70: 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70  ChangeP3(Vdbe *p
3b80: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
3b90: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3ba0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
3bb0: 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69  ( addr>=0 );.  i
3bc0: 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29  f( p->nOp>addr )
3bd0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3be0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3c00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3c10: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3c20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3c30: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3c40: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3c50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3c60: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3c70: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3c80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3c90: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3ca0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3cb0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3cc0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3cd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ce0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3cf0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3d00: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3d10: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3d20: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3d30: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3d40: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3d50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3d60: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3d70: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3d80: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3d90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3da0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
3db0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
3dc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
3dd0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
3de0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
3df0: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
3e00: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
3e10: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
3e20: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
3e30: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
3e40: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
3e50: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
3e60: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
3e70: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57  pDef){.  if( ALW
3e80: 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44  AYS(pDef) && (pD
3e90: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
3ea0: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
3eb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
3ec0: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29  DbFree(db, pDef)
3ed0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
3ee0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
3ef0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20  rray(sqlite3 *, 
3f00: 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  Op *, int);../*.
3f10: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76  ** Delete a P4 v
3f20: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
3f30: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
3f40: 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33  d freeP4(sqlite3
3f50: 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65   *db, int p4type
3f60: 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69  , void *p4){.  i
3f70: 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73  f( p4 ){.    ass
3f80: 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73  ert( db );.    s
3f90: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
3fa0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
3fb0: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
3fc0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
3fd0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
3fe0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
3ff0: 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61  EYINFO:.      ca
4000: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a  se P4_INTARRAY:.
4010: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4020: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b  YINFO_HANDOFF: {
4030: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4040: 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a  DbFree(db, p4);.
4050: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4070: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P4_MPRINTF: {.
4080: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
4090: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
40a0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
40b0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
40c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
40d0: 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e   case P4_VDBEFUN
40e0: 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  C: {.        Vdb
40f0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
4100: 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70   = (VdbeFunc *)p
4110: 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45  4;.        freeE
4120: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
4130: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e  (db, pVdbeFunc->
4140: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
4150: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4160: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
4170: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
4180: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
4190: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
41a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64 62  3DbFree(db, pVdb
41b0: 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  eFunc);.        
41c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
41d0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e       case P4_FUN
41e0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  CDEF: {.        
41f0: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
4200: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
4210: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ef*)p4);.       
4220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4230: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45        case P4_ME
4240: 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  M: {.        if(
4250: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4260: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
4270: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
4280: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
4290: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  e*)p4);.        
42a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
42b0: 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29   Mem *p = (Mem*)
42c0: 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  p4;.          sq
42d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
42e0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
42f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4300: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
4310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
4320: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4330: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4340: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
4350: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4360: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
4370: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
4380: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20   *)p4);.        
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
43a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
43b0: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
43c0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
43d0: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
43e0: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
43f0: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
4400: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
4410: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
4420: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
4430: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
4440: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
4450: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
4460: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
4470: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
4480: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
4490: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
44a0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
44b0: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
44c0: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
44d0: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
44e0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
44f0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
4500: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
4510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4520: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
4530: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
4540: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
4550: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4560: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
4570: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
4580: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
4590: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
45a0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
45b0: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
45c0: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
45d0: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
45e0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
45f0: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
4600: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
4610: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
4620: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
4630: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4640: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
4650: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
4660: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
4670: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
4680: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
4690: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
46a0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
46b0: 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20  hange N opcodes 
46c0: 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72  starting at addr
46d0: 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76   to No-ops..*/.v
46e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
46f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4700: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
4710: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt N){.  if( p->
4720: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
4730: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4740: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4750: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4760: 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  .    while( N-- 
4770: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
4780: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4790: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
47a0: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
47b0: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
47c0: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  );.      pOp->op
47d0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
47e0: 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20        pOp++;.   
47f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4800: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4810: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
4820: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4830: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4840: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4850: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4860: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4870: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
4880: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
4890: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
48a0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
48b0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
48c0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
48d0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
48e0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
48f0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
4900: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
4910: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
4920: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
4930: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
4940: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4950: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4960: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
4970: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
4980: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
4990: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
49a0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
49b0: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
49c0: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
49d0: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
49e0: 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP4..**.** If 
49f0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P4_KEYINFO it
4a00: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20   means that zP4 
4a10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4a20: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4a30: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
4a40: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
4a50: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
4a60: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4a70: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
4a80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20  ite3_malloc, to 
4a90: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
4aa0: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
4ab0: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45  zed..** n==P4_KE
4ac0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
4ad0: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34  dicates that zP4
4ae0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
4af0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
4b00: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
4b10: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
4b20: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
4b30: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
4b40: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
4b50: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
4b60: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
4b70: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
4b80: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
4b90: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
4ba0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
4bb0: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
4bc0: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
4bd0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
4be0: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
4bf0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
4c00: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
4c10: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
4c20: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
4c30: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
4c40: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
4c50: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
4c60: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
4c70: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
4c80: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
4c90: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
4ca0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
4cb0: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
4cc0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4cd0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
4ce0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4cf0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
4d00: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
4d10: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
4d20: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
4d30: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
4d40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4d50: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4d60: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4d70: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
4d80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4d90: 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50  ){.    if ( n!=P
4da0: 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d  4_KEYINFO && n!=
4db0: 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20  P4_VTAB ) {.    
4dc0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20    freeP4(db, n, 
4dd0: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
4de0: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
4df0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
4e00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
4e20: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
4e30: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
4e40: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
4e50: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
4e60: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4e70: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
4e80: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
4e90: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
4ea0: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
4eb0: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
4ec0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
4ed0: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
4ee0: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
4ef0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
4f00: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
4f10: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
4f20: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
4f30: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
4f40: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
4f50: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
4f60: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
4f70: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
4f80: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
4f90: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
4fa0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
4fb0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
4fc0: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
4fd0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
4fe0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
4ff0: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
5000: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
5010: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
5020: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
5030: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
5040: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
5050: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
5060: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
5070: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
5080: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
5090: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
50a0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4f  , nByte);.    pO
50b0: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d  p->p4.pKeyInfo =
50c0: 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69   pKeyInfo;.    i
50d0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
50e0: 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72       u8 *aSortOr
50f0: 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  der;.      memcp
5100: 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  y((char*)pKeyInf
5110: 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20  o, zP4, nByte - 
5120: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 61  nField);.      a
5130: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
5140: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5150: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f 72  ;.      if( aSor
5160: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
5170: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
5180: 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e  tOrder = (unsign
5190: 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e  ed char*)&pKeyIn
51a0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64  fo->aColl[nField
51b0: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
51c0: 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  y(pKeyInfo->aSor
51d0: 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64  tOrder, aSortOrd
51e0: 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  er, nField);.   
51f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e     }.      pOp->
5200: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
5210: 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  NFO;.    }else{.
5220: 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c        p->db->mal
5230: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5240: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5250: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
5260: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
5270: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
5280: 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f  ANDOFF ){.    pO
5290: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
52a0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
52b0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
52c0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
52d0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
52e0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
52f0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5300: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
5310: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
5320: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
5330: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
5340: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
5350: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
5360: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5370: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5380: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5390: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
53a0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
53b0: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
53c0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
53d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
53e0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
53f0: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
5400: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
5410: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
5420: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
5430: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  MIC;.  }.}..#ifn
5440: 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
5450: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
5460: 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d  ent on the the m
5470: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
5480: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
5490: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
54a0: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
54b0: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
54c0: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
54d0: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
54e0: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
54f0: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5500: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5510: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5520: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
5530: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76  tion build..*/.v
5540: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5550: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5570: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5580: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
5590: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  p ) return;.  as
55a0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
55b0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
55c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
55d0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
55e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
55f0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5600: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5610: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5620: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
5630: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5640: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
5650: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5660: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
5670: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
5680: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
5690: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
56a0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
56b0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
56c0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
56d0: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
56e0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
56f0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5700: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
5710: 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29  t ap;.  if( !p )
5720: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
5730: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
5740: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65  OP_Noop);.  asse
5750: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
5760: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
5770: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
5780: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
5790: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
57a0: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
57b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
57c0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63   p->nOp ){.    c
57d0: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61  har **pz = &p->a
57e0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57f0: 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74  mment;.    va_st
5800: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
5810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
5820: 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b  ree(p->db, *pz);
5830: 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74  .    *pz = sqlit
5840: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
5850: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5860: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
5870: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
5880: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
5890: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
58a0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
58b0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
58c0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
58d0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
58e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
58f0: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
5900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
5910: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5920: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5930: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
5940: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
5950: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
5960: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
5970: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
5980: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
5990: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
59a0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
59b0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
59c0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
59d0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
59e0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
59f0: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
5a00: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
5a10: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
5a20: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
5a30: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5a40: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
5a50: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
5a60: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
5a70: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
5a80: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5a90: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
5aa0: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
5ab0: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
5ac0: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
5ad0: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
5ae0: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
5af0: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
5b00: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
5b10: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
5b20: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20  nd..**.** About 
5b30: 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49 54  the #ifdef SQLIT
5b40: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e  E_OMIT_TRACE:  N
5b50: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  ormally, this ro
5b60: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
5b70: 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20  alled.** unless 
5b80: 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20  p->nOp>0.  This 
5b90: 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
5ba0: 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c  e absense of SQL
5bb0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a  ITE_OMIT_TRACE,.
5bc0: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69  ** an OP_Trace i
5bd0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
5be0: 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62 79  ways inserted by
5bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 28   sqlite3VdbeGet(
5c00: 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  ) as soon as.** 
5c10: 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63 72  a new VDBE is cr
5c20: 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72  eated.  So we ar
5c30: 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61 64  e free to set ad
5c40: 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77  dr to p->nOp-1 w
5c50: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5c60: 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   to double-check
5c70: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5c80: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  at the result is
5c90: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42   non-negative. B
5ca0: 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ut.** if SQLITE_
5cb0: 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64 65  OMIT_TRACE is de
5cc0: 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72  fined, the OP_Tr
5cd0: 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61  ace is omitted a
5ce0: 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f  nd we do need to
5cf0: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61  .** check the va
5d00: 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20  lue of p->nOp-1 
5d10: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
5d20: 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  g..*/.VdbeOp *sq
5d30: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
5d40: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5d50: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
5d60: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
5d70: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
5d80: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
5d90: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
5da0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
5db0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
5dc0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
5dd0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
5de0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  . */.  static co
5df0: 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  nst VdbeOp dummy
5e00: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
5e10: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
5e20: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
5e30: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
5e40: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
5e50: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
5e60: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66  f( addr<0 ){.#if
5e70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5e80: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d  TRACE.    if( p-
5e90: 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  >nOp==0 ) return
5ea0: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
5eb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64  ;.#endif.    add
5ec0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5ed0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
5ee0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
5ef0: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
5f00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5f10: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
5f20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
5f30: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
5f40: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
5f50: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
5f60: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
5f70: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
5f80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
5f90: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
5fa0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
5fb0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
5fc0: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
5fd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5fe0: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
5ff0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
6000: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
6010: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
6020: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
6030: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
6040: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
6050: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
6060: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
6070: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
6080: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
6090: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
60a0: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
60b0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
60c0: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
60d0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
60e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
60f0: 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20  NFO_STATIC:.    
6100: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
6110: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
6120: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
6130: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
6140: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
6150: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6160: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6170: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
6180: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
6190: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
61a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
61b0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
61c0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
61d0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
61e0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
61f0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
6200: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
6210: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
6220: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
6230: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6240: 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  n30(pColl->zName
6250: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6260: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
6270: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
6280: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
6290: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
62a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
62b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
62c0: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
62d0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
62e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
62f0: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
6300: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
6310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6320: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
6330: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6340: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6350: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
6360: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
6370: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
6380: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6390: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
63a0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
63b0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
63c0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63d0: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
63e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
63f0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
6400: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
6410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6420: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
6430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6440: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
6450: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
6460: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6470: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6490: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
64a0: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
64b0: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
64c0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
64e0: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
64f0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
6500: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
6510: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
6520: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6530: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
6540: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
6550: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
6560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6570: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
6580: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
6590: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
65a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
65b0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
65c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
65d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
65e0: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
65f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6600: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6610: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
6620: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6630: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6640: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
6650: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6660: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
6670: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
6680: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
6690: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
66a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
66b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
66c0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
66d0: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
66e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
66f0: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
6700: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6710: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
6720: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
6730: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
6740: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6750: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6770: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6780: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
6790: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
67a0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
67b0: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
67c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
67d0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
67e0: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
67f0: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
6800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6810: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
6820: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
6830: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
6840: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
6850: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6860: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6870: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6880: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
6890: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
68a0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
68b0: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
68c0: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
68d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
68e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
68f0: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
6900: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
6910: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
6920: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6930: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
6940: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6950: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6960: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6970: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
6980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6990: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
69a0: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
69b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
69c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
69d0: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
69e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
69f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6a00: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
6a10: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
6a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6a30: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
6a40: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
6a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
6a70: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
6a80: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
6a90: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
6aa0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
6ab0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
6ac0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
6ad0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
6ae0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6af0: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
6b00: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
6b10: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
6b20: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
6b30: 61 62 61 73 65 73 20 74 68 61 74 20 74 68 65 79  abases that they
6b40: 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20   will be using. 
6b50: 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65   A mask of these
6b60: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73   databases.** is
6b70: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70   maintained in p
6b80: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 61 6e 64 20  ->btreeMask and 
6b90: 69 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  is used for lock
6ba0: 69 6e 67 20 61 6e 64 20 6f 74 68 65 72 20 70 75  ing and other pu
6bb0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
6bc0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
6bd0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
6be0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
6bf0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
6c00: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
6c10: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
6c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
6c30: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
6c40: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
6c50: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d   p->btreeMask |=
6c60: 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69   ((yDbMask)1)<<i
6c70: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
6c80: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
6c90: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
6ca0: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70  i].pBt) ){.    p
6cb0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28  ->lockMask |= ((
6cc0: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
6cd0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6ce0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
6cf0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
6d00: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
6d10: 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  E>0./*.** If SQL
6d20: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
6d30: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
6d40: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
6d50: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
6d60: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
6d70: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
6d80: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
6d90: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
6da0: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
6db0: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
6dc0: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
6dd0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
6de0: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
6df0: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
6e00: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
6e10: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
6e20: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
6e30: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
6e40: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
6e50: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
6e60: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
6e70: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
6e80: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
6e90: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
6ea0: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
6eb0: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
6ec0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
6ed0: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
6ee0: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
6ef0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
6f00: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
6f10: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
6f20: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
6f30: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
6f40: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
6f50: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
6f60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
6f70: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
6f80: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
6f90: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
6fa0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
6fb0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
6fc0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
6fd0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
6fe0: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
6ff0: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
7000: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
7010: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
7020: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
7030: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
7040: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
7050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
7060: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
7070: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
7080: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
7090: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
70a0: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
70b0: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
70c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
70d0: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
70e0: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
70f0: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
7100: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
7110: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
7120: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
7130: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
7140: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
7150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7160: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
7170: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
7180: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
7190: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
71a0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
71b0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
71c0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
71d0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
71e0: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
71f0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
7200: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
7210: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
7220: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
7230: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
7240: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
7250: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
7260: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
7270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
7280: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
7290: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
72a0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
72b0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
72c0: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
72d0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
72e0: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
72f0: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
7300: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
7310: 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  er()..*/.void sq
7320: 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56  lite3VdbeLeave(V
7330: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
7340: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
7350: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7360: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
7370: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
7380: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
7390: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
73a0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
73b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
73c0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
73d0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
73e0: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
73f0: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
7400: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
7410: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
7420: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
7430: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
7440: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
7450: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7460: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
7470: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
7480: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
7490: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
74a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
74b0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
74c0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
74d0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
74e0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
74f0: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
7500: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7510: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
7520: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
7530: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
7540: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
7550: 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69  Ptr[50];.  stati
7560: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
7570: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
7580: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
7590: 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  %-4s %.2X %s\n";
75a0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
75b0: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
75c0: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
75d0: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
75e0: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70  eof(zPtr));.  fp
75f0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
7600: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
7610: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
7620: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
7630: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
7640: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
7650: 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66   pOp->p5,.#ifdef
7660: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7670: 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e      pOp->zCommen
7680: 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  t ? pOp->zCommen
7690: 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20  t : "".#else.   
76a0: 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29     "".#endif.  )
76b0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
76c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
76d0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
76e0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
76f0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
7700: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
7710: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
7720: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
7730: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
7740: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
7750: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
7760: 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  u8 malloc_failed
7770: 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
7780: 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  led;.    if( db-
7790: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
77a0: 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  .      for(pEnd=
77b0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
77c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
77d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
77e0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
77f0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
7800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7810: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
7820: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
7830: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
7840: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
7850: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20  ==p[1].db );..  
7860: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
7870: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
7880: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
7890: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
78a0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
78b0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
78c0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
78d0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
78e0: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
78f0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
7900: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
7910: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
7920: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
7930: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
7940: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
7950: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
7960: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
7970: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
7980: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
7990: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
79a0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
79b0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
79c0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
79d0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
79e0: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
79f0: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
7a00: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
7a10: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
7a20: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
7a30: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
7a40: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
7a50: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
7a60: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
7a70: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
7a80: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
7a90: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
7aa0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
7ab0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
7ac0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
7ad0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
7ae0: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
7af0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
7b00: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
7b10: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
7b20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
7b30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
7b40: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
7b50: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
7b60: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
7b70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7b80: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
7b90: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
7ba0: 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20   if( p->zMalloc 
7bb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7bc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7bd0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
7be0: 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30    p->zMalloc = 0
7bf0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7c00: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
7c10: 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Null;.    }.    
7c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c30: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
7c40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
7c50: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
7c60: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
7c70: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
7c80: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
7c90: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
7ca0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
7cb0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
7cc0: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
7cd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7ce0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
7cf0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
7d00: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
7d10: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
7d20: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
7d30: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
7d40: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
7d50: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
7d60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7d70: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
7d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
7d90: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
7da0: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
7db0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
7dc0: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
7dd0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
7de0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
7df0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
7e00: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7e10: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
7e20: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
7e30: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
7e40: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
7e50: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
7e60: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
7e70: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
7e80: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
7e90: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
7ea0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
7eb0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
7ec0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
7ed0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
7ee0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
7ef0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
7f00: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
7f10: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
7f20: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
7f30: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
7f40: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
7f50: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
7f60: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
7f70: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
7f80: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
7f90: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
7fa0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
7fb0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
7fc0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
7fd0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
7fe0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
7ff0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8000: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
8010: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
8020: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
8030: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
8040: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
8050: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
8060: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
8070: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
8080: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
80a0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
80b0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
80e0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
80f0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
8100: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
8130: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
8140: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
8150: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8170: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
8180: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
8190: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81b0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
81c0: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
81d0: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
81e0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8200: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
8210: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
8220: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8250: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
8260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8280: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8290: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
82a0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
82b0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 69  >aMem[1];  /* Fi
82c0: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
82d0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
82e0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
82f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
8300: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8310: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
8320: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8330: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
8340: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
8350: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8360: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
8370: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
8380: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
8390: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
83a0: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
83b0: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
83c0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
83d0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
83e0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
83f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
8400: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
8410: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
8420: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
8430: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
8440: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
8450: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8460: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
8470: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
8480: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
8490: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
84a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
84b0: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
84c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
84d0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
84e0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
84f0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
8500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8510: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
8520: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
8530: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
8540: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
8550: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
8560: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
8570: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
8580: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
8590: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
85a0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
85b0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
85c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
85d0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
85e0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
85f0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
8600: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8610: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
8620: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
8630: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
8640: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
8650: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
8660: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
8670: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
8680: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
8690: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
86a0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
86b0: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
86c0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
86d0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
86e0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
86f0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
8700: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
8710: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
8720: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
8730: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
8740: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
8750: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
8760: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
8770: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
8780: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
8790: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
87a0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
87b0: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
87c0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
87d0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
87e0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
87f0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
8800: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
8810: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
8820: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
8830: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
8840: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8850: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
8860: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
8870: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
8880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8890: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
88a0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
88b0: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
88c0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
88d0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
88e0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
88f0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
8900: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
8910: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
8920: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
8930: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
8940: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
8950: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
8960: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
8970: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
8980: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
8990: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
89a0: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
89b0: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
89c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
89d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
89e0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
89f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
8a00: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
8a10: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
8a20: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
8a30: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
8a40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
8a50: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
8a60: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
8a70: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
8a80: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
8a90: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
8aa0: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  z;.    Op *pOp;.
8ab0: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
8ac0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
8ad0: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
8ae0: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
8af0: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
8b00: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
8b10: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
8b20: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
8b30: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
8b40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b50: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
8b60: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
8b70: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
8b80: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
8b90: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
8ba0: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
8bb0: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
8bc0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
8bd0: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
8be0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
8bf0: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
8c00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
8c10: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
8c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c30: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
8c40: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
8c50: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
8c60: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
8c70: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8c80: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
8c90: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
8ca0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d  NTEGER;.      pM
8cb0: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8ce0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
8cf0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
8d00: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
8d10: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
8d20: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
8d30: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
8d40: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
8d50: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
8d60: 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f  ->opcode);  /* O
8d70: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
8d80: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
8d90: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
8da0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
8db0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
8dc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
8dd0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
8de0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
8df0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
8e00: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
8e10: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
8e20: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
8e30: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
8e40: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
8e50: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
8e60: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
8e70: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
8e80: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
8e90: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
8ea0: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
8eb0: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
8ec0: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
8ed0: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
8ee0: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
8ef0: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
8f00: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
8f10: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
8f20: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
8f30: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
8f40: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
8f50: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
8f60: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
8f70: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
8f80: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8f90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8fa0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
8fb0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
8fc0: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
8fd0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
8fe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ff0: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
9000: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
9010: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
9020: 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 7b  ub, nByte, 1) ){
9030: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
9040: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
9050: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
9060: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
9070: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
9080: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
9090: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
90a0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
90b0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
90c0: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
90d0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
90e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
90f0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
9100: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
9110: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
9120: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9140: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
9150: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
9160: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
9170: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
9180: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
9190: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
91a0: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
91d0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
91e0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
91f0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
9200: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9210: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
9220: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
9250: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9260: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
9270: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9280: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9290: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32  MemGrow(pMem, 32
92a0: 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20  , 0) ){         
92b0: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
92c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
92d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
92e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
92f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9300: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
9310: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
9320: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
9330: 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28    z = displayP4(
9340: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
9350: 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d  );.    if( z!=pM
9360: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  em->z ){.      s
9370: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
9380: 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c  Str(pMem, z, -1,
9390: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
93a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
93b0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
93c0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
93d0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
93e0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
93f0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
9400: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
9420: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9430: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
9440: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
9450: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9470: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
9480: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
9490: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
94a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
94b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
94c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
94d0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
94e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
94f0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9500: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9510: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9520: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
9530: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
9540: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
9550: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
9560: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
9570: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
9580: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
9590: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
95a0: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
95b0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
95c0: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
95d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
95e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
95f0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
9600: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f      pMem->z = pO
9610: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  p->zComment;.   
9620: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
9630: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9640: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
9650: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
9660: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
9670: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9680: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9690: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
96a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
96b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
96c0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96e0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  Comment */.     
96f0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9700: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20  SQLITE_NULL;.   
9710: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9720: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
9730: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
9740: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  n-1);.    p->rc 
9750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
9770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9780: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
9790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
97a0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
97b0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
97c0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
97d0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
97e0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
97f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
9800: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
9810: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
9820: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9830: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9840: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
9850: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
9860: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9870: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9880: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9890: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
98a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
98b0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
98c0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
98d0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
98e0: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
98f0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
9900: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9910: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9920: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
9930: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9940: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
9950: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
9960: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
9970: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
9980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9990: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
99a0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
99b0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
99c0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
99d0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
99e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
99f0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9a00: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9a10: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9a20: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9a30: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9a40: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
9a50: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
9a60: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
9a70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9a80: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
9a90: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
9aa0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
9ab0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
9ac0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
9ad0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
9ae0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9af0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
9b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
9b10: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
9b20: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
9b30: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
9b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9b50: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
9b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b70: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
9b80: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
9b90: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
9ba0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9bb0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
9bc0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
9bd0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
9be0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9bf0: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
9c00: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
9c10: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9c20: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
9c30: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
9c40: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
9c50: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
9c60: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
9c70: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
9c80: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
9c90: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
9ca0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
9cb0: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
9cc0: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
9cd0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
9ce0: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
9cf0: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
9d00: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
9d10: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
9d20: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
9d30: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
9d40: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
9d50: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
9d60: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
9d70: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
9d80: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
9d90: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
9da0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
9db0: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
9dc0: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
9dd0: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
9de0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9df0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
9e00: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
9e10: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
9e20: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
9e30: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
9e40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
9e50: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
9e60: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
9e70: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
9e80: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
9e90: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
9ea0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
9eb0: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
9ec0: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
9ed0: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
9ee0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
9ef0: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
9f00: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
9f10: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
9f20: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
9f30: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
9f40: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
9f50: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
9f60: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
9f70: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
9f80: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
9f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
9fa0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
9fb0: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
9fc0: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
9fd0: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
9fe0: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
9ff0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
a000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a010: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
a020: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
a030: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
a040: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
a050: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
a060: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
a070: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a080: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
a090: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
a0a0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
a0b0: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
a0c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
a0d0: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
a0e0: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
a0f0: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
a100: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a110: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
a120: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
a130: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
a140: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
a150: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
a160: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
a170: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
a180: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
a190: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
a1a0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
a1b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
a1c0: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
a1d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
a1e0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  f;.}../*.** Prep
a1f0: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
a200: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
a210: 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ion.  This invol
a220: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
a230: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
a240: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
a250: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
a260: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
a270: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
a280: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
a290: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
a2a0: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
a2b0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
a2c0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
a2d0: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
a2e0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
a2f0: 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42  ay to move a VDB
a300: 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  E from VDBE_MAGI
a310: 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42  C_INIT to.** VDB
a320: 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a  E_MAGIC_RUN..**.
a330: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a340: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6d   may be called m
a350: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e  ore than once on
a360: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
a370: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68  l machine..** Th
a380: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73 20  e first call is 
a390: 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70 69  made while compi
a3a0: 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61  ling the SQL sta
a3b0: 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75 65  tement. Subseque
a3c0: 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20  nt.** calls are 
a3d0: 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 20  made as part of 
a3e0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 72  the process of r
a3f0: 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74 65  esetting a state
a400: 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65  ment to be.** re
a410: 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d 20  -executed (from 
a420: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
a430: 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65 20  3_reset()). The 
a440: 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72  nVar, nMem, nCur
a450: 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78  sor .** and isEx
a460: 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72 73  plain parameters
a470: 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65 64   are only passed
a480: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73 20   correct values 
a490: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  the first time.*
a4a0: 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  * the function i
a4b0: 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62  s called. On sub
a4c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66  sequent calls, f
a4d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  rom sqlite3_rese
a4e0: 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20  t(), nVar.** is 
a4f0: 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d  passed -1 and nM
a500: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64 20  em, nCursor and 
a510: 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61 6c  isExplain are al
a520: 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a  l passed zero..*
a530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
a540: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
a550: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a570: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
a580: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
a5b0: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
a5c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a5d0: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a5f0: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
a600: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
a610: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
a620: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
a630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a640: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
a650: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
a660: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
a670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
a680: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
a690: 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f 67 72  args in SubProgr
a6a0: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ams */.  int isE
a6b0: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
a6c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a6d0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
a6e0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
a6f0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73  nt */.  int uses
a700: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20  StmtJournal     
a710: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
a720: 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65 73 53  o set Vdbe.usesS
a730: 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b  tmtJournal */.){
a740: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
a750: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
a760: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
a770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
a780: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
a790: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
a7a0: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
a7b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
a7c0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
a7d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
a7e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
a7f0: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
a800: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
a810: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
a820: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
a830: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
a840: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
a850: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
a860: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
a870: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
a880: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
a890: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
a8a0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
a8b0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
a8c0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
a8d0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
a8e0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
a8f0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
a900: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
a910: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
a920: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
a930: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
a940: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
a950: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
a960: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
a970: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
a980: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
a990: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
a9a0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
a9b0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
a9c0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
a9d0: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
a9e0: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
a9f0: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
aa00: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
aa10: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
aa20: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
aa30: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
aa40: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
aa50: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
aa60: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
aa70: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
aa80: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
aa90: 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  n. This is only 
aaa0: 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  done the.  ** fi
aab0: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 75  rst time this fu
aac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
aad0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42   for a given VDB
aae0: 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69  E, not when it i
aaf0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c  s.  ** being cal
ab00: 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  led from sqlite3
ab10: 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 65  _reset() to rese
ab20: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
ab30: 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  chine..  */.  if
ab40: 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c 57  ( nVar>=0 && ALW
ab50: 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  AYS(db->mallocFa
ab60: 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20  iled==0) ){.    
ab70: 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a  u8 *zCsr = (u8 *
ab80: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
ab90: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  ;       /* Memor
aba0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
abb0: 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  alloation */.   
abc0: 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20   u8 *zEnd = (u8 
abd0: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
abe0: 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73  Alloc];  /* Firs
abf0: 74 20 62 79 74 65 20 70 61 73 74 20 61 76 61 69  t byte past avai
ac00: 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20  lable mem */.   
ac10: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
ac40: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
ac50: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20  y needed */..   
ac60: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
ac70: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20  (p, &nArg);.    
ac80: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
ac90: 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74 6d  al = (u8)usesStm
aca0: 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66  tJournal;.    if
acb0: 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e  ( isExplain && n
acc0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20  Mem<10 ){.      
acd0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d  nMem = 10;.    }
ace0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72  .    memset(zCsr
acf0: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
ad00: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43  .    zCsr += (zC
ad10: 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a  sr - (u8*)0)&7;.
ad20: 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47 48      assert( EIGH
ad30: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ad40: 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f  (zCsr) );..    /
ad50: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
ad60: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
ad70: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
ad80: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
ad90: 20 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73   two.    ** pass
ada0: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
adb0: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
adc0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73  o reuse unused s
add0: 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 20  pace at the .   
ade0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
adf0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
ae00: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
ae10: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
ae20: 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65 71 75  mory.    ** requ
ae30: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
ae40: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
ae50: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
ae60: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
ae70: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
ae80: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
ae90: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
aea0: 61 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a  ation.  .    **.
aeb0: 20 20 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d      ** This two-
aec0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
aed0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
aee0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
aef0: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ible from.    **
af00: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70   the leftover sp
af10: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
af20: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
af30: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  ay can significa
af40: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65 64 75  ntly.    ** redu
af50: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
af60: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
af70: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
af80: 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
af90: 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74   do {.      nByt
afa0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
afb0: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
afc0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
afd0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
afe0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
aff0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  );.      p->aVar
b000: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b010: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
b020: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
b030: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b040: 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20       p->apArg = 
b050: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
b060: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
b070: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
b080: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b090: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61      p->azVar = a
b0a0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56  llocSpace(p->azV
b0b0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b0c0: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  char*), &zCsr, z
b0d0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b0e0: 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
b0f0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43  llocSpace(p->apC
b100: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
b110: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c  of(VdbeCursor*),
b120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
b140: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  );.      if( nBy
b160: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  te ){.        p-
b170: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
b180: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b190: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
b1a0: 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d  .      zCsr = p-
b1b0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45  >pFree;.      zE
b1c0: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
b1d0: 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  ];.    }while( n
b1e0: 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  Byte && !db->mal
b1f0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
b200: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28    p->nCursor = (
b210: 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20  u16)nCursor;.   
b220: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
b230: 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20        p->nVar = 
b240: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
b250: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
b260: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
b270: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
b280: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
b290: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
b2a0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
b2b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b2c0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
b2d0: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
b300: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
b310: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  .      p->nMem =
b320: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b330: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
b340: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
b350: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  -1 */.      for(
b360: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
b370: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
b380: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
b390: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
b3a0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
b3b0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
b3c0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
b3d0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
b3e0: 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b  (n=1; n<p->nMem;
b3f0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   n++){.    asser
b400: 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62  t( p->aMem[n].db
b410: 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ==db );.  }.#end
b420: 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  if..  p->pc = -1
b430: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
b440: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
b450: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
b460: 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e  rt;.  p->explain
b470: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
b480: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b490: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
b4a0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
b4b0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
b4c0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
b4d0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
b4e0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
b4f0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
b500: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
b510: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
b520: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
b530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b540: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
b550: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
b560: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
b570: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
b580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b590: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
b5a0: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
b5b0: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
b5c0: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
b5d0: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
b5e0: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
b5f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b600: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
b610: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
b620: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
b630: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
b640: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
b650: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
b660: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b670: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
b680: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
b690: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
b6a0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
b6b0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
b6c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
b6d0: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
b6e0: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
b6f0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
b700: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
b710: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
b720: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
b730: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
b740: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
b750: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
b760: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
b770: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
b780: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
b790: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
b7a0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
b7b0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
b7c0: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
b7d0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
b7e0: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
b7f0: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
b800: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
b810: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
b820: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
b830: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
b840: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
b850: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
b860: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
b870: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
b880: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
b890: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
b8a0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
b8b0: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
b8c0: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
b8d0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
b8e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
b8f0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
b900: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
b910: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
b920: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
b930: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
b940: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
b950: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
b960: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
b970: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
b980: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
b990: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
b9a0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
b9b0: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
b9c0: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
b9d0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
b9e0: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
b9f0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
ba00: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
ba10: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
ba20: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
ba30: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
ba40: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
ba50: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
ba60: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
ba70: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
ba80: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
ba90: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
baa0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
bab0: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
bac0: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
bad0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
bae0: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
baf0: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
bb00: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
bb10: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
bb20: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
bb30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bb40: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
bb50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
bb60: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
bb70: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
bb80: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
bb90: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
bba0: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
bbb0: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
bbc0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
bbd0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
bbe0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
bbf0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
bc00: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
bc10: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
bc20: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
bc30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bc40: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
bc50: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
bc60: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
bc70: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
bc80: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
bc90: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
bca0: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
bcb0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
bcc0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bcd0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
bce0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
bcf0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
bd00: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
bd10: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
bd20: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
bd30: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
bd40: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
bd50: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
bd60: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
bd70: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
bd80: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
bd90: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
bda0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
bdb0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
bdc0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
bdd0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
bde0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
bdf0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
be00: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
be10: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
be20: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
be30: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
be40: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
be50: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
be60: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
be70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
be80: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
be90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bea0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
beb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
bec0: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
bed0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
bee0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
bef0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
bf00: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
bf10: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
bf20: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
bf30: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
bf40: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
bf50: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
bf60: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
bf70: 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73  sr==0 || p->apCs
bf80: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  r[i]==0 );.  for
bf90: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
bfa0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
bfb0: 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e  ->aMem==0 || p->
bfc0: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
bfd0: 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69  EM_Null );.#endi
bfe0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
bff0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
c000: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
c010: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
c020: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
c030: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
c040: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c050: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
c060: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c070: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
c080: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
c090: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
c0a0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
c0b0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
c0c0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
c0d0: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
c0e0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
c0f0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
c100: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
c110: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
c120: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
c130: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
c140: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
c150: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
c160: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
c170: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c180: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c190: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
c1a0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c1b0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
c1c0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
c1d0: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
c1e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
c1f0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
c200: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c210: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
c220: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
c230: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
c240: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
c250: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
c260: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c270: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
c280: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
c290: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
c2a0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
c2b0: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
c2c0: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
c2d0: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
c2e0: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
c2f0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
c300: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
c310: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c320: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
c330: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
c350: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
c360: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
c370: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
c380: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
c390: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
c3a0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
c3b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
c3c0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
c3d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
c3e0: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
c3f0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
c400: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
c410: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
c420: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
c430: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
c440: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c450: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
c460: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
c470: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
c480: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
c490: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
c4a0: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
c4b0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c4c0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
c4d0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
c500: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
c510: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
c540: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
c550: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
c560: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
c590: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
c5a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
c5b0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
c5c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
c5d0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
c5e0: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
c5f0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
c600: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
c610: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
c620: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
c630: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
c640: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
c650: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
c660: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
c670: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
c680: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
c690: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
c6a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c6b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
c6c0: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
c6d0: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
c6e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c6f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
c700: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
c710: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
c720: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
c730: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
c740: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
c750: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
c760: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
c770: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
c780: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
c790: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
c7a0: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
c7b0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
c7c0: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
c7d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c7e0: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
c7f0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
c800: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
c810: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
c820: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
c830: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
c840: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
c850: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
c860: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
c870: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
c880: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
c890: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
c8a0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
c8b0: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
c8c0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
c8d0: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
c8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
c8f0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
c900: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
c910: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
c920: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
c930: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
c940: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
c950: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
c960: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
c970: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
c980: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
c990: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
c9a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c9b0: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
c9c0: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
c9d0: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
c9e0: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
c9f0: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
ca00: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
ca10: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
ca20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
ca30: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
ca40: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
ca50: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
ca60: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
ca70: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
ca80: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
ca90: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
caa0: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
cab0: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
cac0: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
cad0: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
cae0: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
caf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cb00: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
cb10: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
cb20: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
cb30: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
cb40: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
cb50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
cb60: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
cb70: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
cb80: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
cb90: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
cba0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
cbb0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
cbc0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
cbd0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
cbe0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
cbf0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
cc00: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
cc10: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
cc20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
cc30: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
cc40: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
cc50: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
cc60: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
cc70: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
cc80: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
cc90: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
cca0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
ccb0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
ccc0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
ccd0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
cce0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ccf0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
cd00: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
cd10: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cd20: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cd30: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
cd40: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
cd50: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
cd60: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
cd70: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
cd80: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
cd90: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
cda0: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
cdb0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
cdc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
cdd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cde0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cdf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
ce00: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
ce10: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
ce20: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
ce30: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
ce40: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
ce50: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
ce60: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
ce70: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
ce80: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
ce90: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
cea0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ceb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cec0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
ced0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
cee0: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
cef0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
cf00: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
cf10: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
cf20: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
cf30: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
cf40: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
cf50: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
cf60: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
cf70: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
cf80: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
cf90: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
cfa0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
cfb0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
cfc0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
cfd0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
cfe0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
cff0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
d000: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
d010: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
d020: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
d030: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
d040: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
d050: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
d060: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
d070: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
d080: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
d090: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
d0a0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
d0b0: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
d0c0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
d0d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d0e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d0f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
d100: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d110: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d120: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d130: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d140: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
d150: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
d160: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d170: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
d180: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
d190: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
d1a0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
d1b0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
d1c0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
d1d0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
d1e0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
d1f0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
d200: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
d210: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
d220: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
d230: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
d240: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
d250: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
d260: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
d270: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
d280: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d290: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
d2a0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
d2b0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d2c0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d2d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d2e0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d2f0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d300: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d310: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d320: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d330: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
d340: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d350: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d360: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
d370: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
d380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d390: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
d3a0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
d3b0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
d3c0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
d3d0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
d3e0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
d3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d400: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
d410: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
d420: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
d430: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
d440: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
d450: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
d460: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d470: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
d480: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
d490: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
d4a0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
d4b0: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
d4c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d4d0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
d4e0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
d4f0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d500: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
d510: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
d520: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
d530: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
d540: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
d550: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a  int res;..    /*
d560: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
d570: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d580: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
d590: 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
d5a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
d5b0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d5c0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d5d0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
d5e0: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
d5f0: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a  Random);.      z
d600: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
d610: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
d620: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
d630: 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66  le, iRandom&0x7f
d640: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
d650: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
d660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d670: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d680: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
d690: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
d6a0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
d6b0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
d6c0: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
d6d0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
d6e0: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
d6f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d700: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
d710: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
d720: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
d730: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d740: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
d750: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
d760: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
d770: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
d780: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
d790: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
d7a0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
d7b0: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
d7c0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
d7d0: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
d7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d7f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
d810: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d820: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
d830: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
d840: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
d850: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
d860: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
d870: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
d880: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
d890: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d8a0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
d8b0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
d8c0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
d8d0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
d8e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d8f0: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
d900: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
d910: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
d920: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
d930: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d940: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
d950: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
d960: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
d970: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
d980: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
d990: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d9a0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
d9b0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d9c0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d9d0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d9e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
d9f0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
da00: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
da10: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
da20: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
da30: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
da40: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
da50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
da60: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
da70: 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
da80: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
da90: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
dab0: 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
dac0: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
dad0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
dae0: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
daf0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
db00: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
db10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
db30: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
db40: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
db50: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
db60: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
db70: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
db80: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
db90: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
dba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dbb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dbc0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
dbd0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
dbe0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
dbf0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
dc00: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
dc10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
dc20: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
dc30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
dc40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dc50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
dc60: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
dc70: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
dc80: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
dc90: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
dca0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
dcb0: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
dcc0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
dcd0: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
dce0: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
dcf0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
dd00: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
dd10: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
dd20: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
dd30: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
dd40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
dd50: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
dd60: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
dd70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
dd80: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
dd90: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
dda0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ddb0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
ddc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ddd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
dde0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
ddf0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
de00: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
de10: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
de20: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
de30: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
de40: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
de50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
de60: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
de70: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
de80: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
de90: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
dea0: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
deb0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
dec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
ded0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
dee0: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
def0: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
df00: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
df10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
df20: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
df30: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
df40: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
df50: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
df60: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
df70: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
df80: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
df90: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
dfa0: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
dfb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
dfc0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
dfd0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
dfe0: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
dff0: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
e000: 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
e010: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e020: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
e030: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
e040: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e050: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e060: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
e070: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e080: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e090: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
e0a0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
e0b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e0c0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
e0d0: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
e0e0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
e0f0: 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
e100: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e120: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e130: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
e140: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
e150: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
e160: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e170: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
e180: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
e190: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
e1a0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
e1b0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
e1c0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
e1d0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
e1e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
e1f0: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
e200: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
e210: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e220: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e230: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
e240: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e250: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
e260: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
e270: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e280: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
e290: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
e2a0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
e2b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
e2c0: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
e2d0: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
e2e0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
e2f0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
e300: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
e310: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
e320: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
e330: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
e340: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
e350: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
e360: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
e370: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
e380: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
e390: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
e3a0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
e3b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
e3c0: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
e3d0: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
e3e0: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
e3f0: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
e400: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
e410: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
e420: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
e430: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
e440: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
e450: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
e460: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
e470: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
e480: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
e490: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e4a0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
e4b0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e4c0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e4d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
e4e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e4f0: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
e500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e510: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
e520: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
e530: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
e540: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
e550: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
e560: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
e570: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
e580: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
e590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
e5a0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
e5b0: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
e5c0: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
e5d0: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
e5e0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
e5f0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
e600: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
e610: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
e620: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
e630: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
e640: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
e650: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
e660: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
e670: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
e680: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
e690: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
e6a0: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
e6b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
e6c0: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
e6d0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
e6e0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
e6f0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
e700: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
e710: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
e720: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
e730: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
e740: 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  te = 0;.  p = db
e750: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
e760: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
e770: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
e780: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
e790: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
e7a0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
e7b0: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
e7c0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Write++;.    }. 
e7d0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
e7e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
e7f0: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
e800: 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  beCnt );.  asser
e810: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77  t( nWrite==db->w
e820: 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  riteVdbeCnt );.}
e830: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
e840: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
e850: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
e860: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
e870: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
e880: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
e890: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
e8a0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
e8b0: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
e8c0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
e8d0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
e8e0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
e8f0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
e900: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
e910: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
e920: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
e930: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
e940: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
e950: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
e960: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
e970: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
e980: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
e990: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
e9a0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
e9b0: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
e9c0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
e9d0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
e9e0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
e9f0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
ea00: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
ea10: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
ea20: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
ea30: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
ea40: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
ea50: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
ea60: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
ea70: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
ea80: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
ea90: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
eaa0: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
eab0: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
eac0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
ead0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
eae0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
eaf0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
eb00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
eb10: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
eb20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
eb30: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
eb40: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
eb50: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
eb60: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
eb70: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
eb80: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
eb90: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
eba0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
ebb0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
ebc0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
ebd0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
ebe0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
ebf0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
ec00: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ec10: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
ec20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
ec30: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
ec40: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
ec50: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
ec60: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
ec70: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
ec80: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
ec90: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
eca0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
ecb0: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
ecc0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
ecd0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
ece0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
ecf0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
ed00: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
ed10: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
ed20: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
ed30: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
ed40: 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a   is commtted..**
ed50: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
ed60: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
ed70: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
ed80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ed90: 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
eda0: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
edb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
edc0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
edd0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
ede0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
edf0: 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
ee00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ee10: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
ee20: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73  p->iStatement is
ee30: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
ee40: 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64  ro, then this Vd
ee50: 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a  be opened a .  *
ee60: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
ee70: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f  saction that sho
ee80: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65  uld be closed he
ee90: 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63  re. The only exc
eea0: 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  eption.  ** is t
eeb0: 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hat an IO error 
eec0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
eed0: 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
eee0: 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
eef0: 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
ef00: 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
ef10: 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
ef20: 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
ef30: 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
ef40: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
ef50: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
ef60: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ef70: 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
ef80: 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
ef90: 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
efa0: 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
efb0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
efc0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
efd0: 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
efe0: 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
eff0: 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
f000: 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
f010: 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
f020: 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
f030: 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
f040: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
f050: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
f060: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
f070: 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
f080: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
f090: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
f0a0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
f0b0: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
f0c0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f0d0: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
f0e0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
f0f0: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
f100: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
f110: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f120: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f130: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
f140: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
f150: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
f160: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
f170: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
f180: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
f190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f1a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f1c0: 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
f1d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f1e0: 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
f1f0: 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
f200: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
f210: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f220: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
f230: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f240: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
f250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f260: 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
f270: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
f280: 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
f290: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f2a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f2b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
f2c0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
f2d0: 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
f2e0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
f2f0: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f300: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
f310: 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
f320: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
f330: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
f340: 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
f350: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
f360: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
f370: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
f380: 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
f390: 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
f3a0: 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
f3b0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f3c0: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
f3d0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
f3e0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f3f0: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
f400: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
f410: 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
f420: 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
f430: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f440: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f450: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
f460: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
f470: 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
f480: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
f490: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f4a0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
f4b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
f4c0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
f4d0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
f4e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
f4f0: 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
f500: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
f510: 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
f520: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
f530: 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
f540: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
f550: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
f560: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
f570: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
f580: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
f590: 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
f5a0: 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
f5b0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
f5c0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
f5d0: 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a  RAINT and write.
f5e0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ** an error mess
f5f0: 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
f600: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
f610: 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
f620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f630: 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
f640: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
f650: 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
f660: 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
f670: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
f680: 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
f690: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f6a0: 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72  ns>0) || (!defer
f6b0: 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
f6c0: 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20  straint>0) ){.  
f6d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
f6e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
f6f0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
f700: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
f710: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
f720: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
f730: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  , "foreign key c
f740: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
f750: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
f760: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
f770: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f780: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
f790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f7a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
f7b0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
f7c0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
f7d0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
f7e0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
f7f0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
f800: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
f810: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
f820: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
f830: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
f840: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
f850: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
f860: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
f870: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
f880: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
f890: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
f8a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
f8b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
f8c0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
f8d0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
f8e0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
f8f0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
f900: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
f910: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
f920: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
f930: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
f940: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
f950: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
f960: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
f970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f980: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
f990: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
f9a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
f9b0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
f9c0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
f9d0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
f9e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f9f0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
fa00: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
fa30: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
fa40: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
fa50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
fa60: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
fa70: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
fa80: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
fa90: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
faa0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
fab0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
fac0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
fad0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
fae0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
faf0: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
fb00: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
fb10: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
fb20: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
fb30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
fb40: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
fb50: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
fb60: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
fb70: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
fb80: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
fb90: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
fba0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
fbb0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
fbc0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
fbd0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
fbe0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
fbf0: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
fc00: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
fc10: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
fc20: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
fc30: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
fc40: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
fc50: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
fc60: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
fc70: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
fc80: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
fc90: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
fca0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
fcb0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
fcc0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
fcd0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
fce0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
fcf0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
fd00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fd10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
fd20: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
fd30: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
fd40: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
fd50: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
fd60: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
fd70: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
fd80: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
fd90: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
fda0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
fdb0: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
fdc0: 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
fdd0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
fde0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
fdf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
fe00: 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
fe10: 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
fe20: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
fe30: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
fe40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
fe50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
fe60: 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
fe70: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
fe80: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
fe90: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
fea0: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
feb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
fec0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
fed0: 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
fee0: 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
fef0: 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
ff00: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
ff10: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
ff20: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
ff30: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
ff60: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
ff70: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
ff80: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
ff90: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
ffa0: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
ffb0: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
ffc0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
ffd0: 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
ffe0: 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
fff0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
10000 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
10010 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
10020 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
10030 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
10040 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
10050 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
10060 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
10070 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
10080 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
10090 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
100a0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
100b0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
100c0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
100d0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
100e0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
100f0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
10100 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
10110 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
10120 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
10130 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
10140 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
10150 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
10160 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
10170 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
10180 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
10190 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
101a0 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
101b0 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
101c0 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
101d0 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
101e0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
101f0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
10200 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
10210 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
10220 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
10230 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
10240 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
10250 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
10260 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
10270 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
10280 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
10290 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
102a0 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
102b0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
102c0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
102d0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
102e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102f0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
10300 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
10310 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
10320 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
10330 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
10340 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
10350 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
10360 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
10370 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
10380 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
10390 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
103a0 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
103b0 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
103c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
103d0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
103e0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
103f0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
10400 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
10410 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
10420 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
10430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10440 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
10450 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
10460 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
10470 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
10480 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10490 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
104a0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
104b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
104c0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
104d0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
104e0 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
104f0 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
10500 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
10510 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
10520 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
10530 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
10540 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
10550 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
10560 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
10570 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
10580 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
10590 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
105a0 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
105b0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
105c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
105d0 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
105e0 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
105f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
10600 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
10610 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
10620 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
10630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10650 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
10660 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
10670 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
10680 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10690 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
106a0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
106b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
106c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
106d0 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
106e0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
106f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10700 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
10710 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10720 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
10730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
10750 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
10760 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
10770 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
10780 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
10790 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
107a0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
107b0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
107c0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
107d0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
107e0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
107f0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
10800 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
10810 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
10820 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
10830 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
10840 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
10850 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
10860 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
10870 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
10880 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
10890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
108b0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
108c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
108d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
108e0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
108f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
10900 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
10910 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
10920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10930 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10950 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
10960 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10970 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
10980 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
10990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
109a0 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
109b0 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
109c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
109d0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
109e0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
109f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10a00 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
10a10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
10a20 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
10a30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
10a40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10a50 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
10a60 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
10a70 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
10a80 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
10a90 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
10aa0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
10ab0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
10ac0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
10ad0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10ae0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
10af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10b00 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
10b10 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
10b20 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
10b30 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
10b40 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
10b50 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
10b60 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
10b70 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
10b80 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
10b90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
10ba0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
10bb0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
10bc0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
10bd0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
10be0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
10bf0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
10c00 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
10c10 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
10c20 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
10c30 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
10c40 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
10c50 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
10c60 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
10c70 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
10c80 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
10c90 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
10ca0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
10cb0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
10cc0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
10cd0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
10ce0 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  code..    **.   
10cf0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 71   ** Note that sq
10d00 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10d10 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20 6f 6e  atement() can on
10d20 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74 61 74  ly fail if eStat
10d30 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 69  ementOp.    ** i
10d40 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
10d50 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20 70 2d  BACK.  But if p-
10d60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 74  >rc==SQLITE_OK t
10d70 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  hen eStatementOp
10d80 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  .    ** must be 
10d90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10da0 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20 4e 45  E.  Hence the NE
10db0 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  VER(p->rc==SQLIT
10dc0 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20 2a 2a  E_OK) in .    **
10dd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
10de0 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
10df0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
10e00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
10e10 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
10e20 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
10e30 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
10e40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10e50 20 20 20 61 73 73 65 72 74 28 20 65 53 74 61 74     assert( eStat
10e60 65 6d 65 6e 74 4f 70 3d 3d 53 41 56 45 50 4f 49  ementOp==SAVEPOI
10e70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
10e80 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
10e90 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  (p->rc==SQLITE_O
10ea0 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  K) || p->rc==SQL
10eb0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
10ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
10ed0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
10ee0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10ef0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
10f00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
10f10 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
10f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76     }.        inv
10f30 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
10f40 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
10f50 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
10f60 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10f70 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
10f80 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
10f90 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
10fa0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
10fb0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10fc0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
10fd0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
10fe0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
10ff0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
11000 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11010 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
11020 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
11030 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
11040 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
11050 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
11060 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
11070 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
11080 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
11090 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
110a0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
110b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
110c0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
110d0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
110e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
110f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11100 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
11110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
11120 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
11130 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
11140 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
11150 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
11160 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
11170 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
11180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
11190 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
111a0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
111b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
111c0 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
111d0 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20  ema(db, -1);.   
111e0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
111f0 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
11200 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
11210 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11220 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
11230 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
11240 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11250 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
11260 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
11270 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
11280 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
11290 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
112a0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
112b0 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
112c0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  beCnt--;.    if(
112d0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b   !p->readOnly ){
112e0 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65  .      db->write
112f0 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d  VdbeCnt--;.    }
11300 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11310 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d  >activeVdbeCnt>=
11320 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
11330 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
11340 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
11350 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
11360 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
11370 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11380 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11390 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
113a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
113b0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
113c0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
113d0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
113e0 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
113f0 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
11400 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
11410 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
11420 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
11430 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11440 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
11450 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
11460 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
11470 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
11480 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
11490 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
114a0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
114b0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
114c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
114d0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c  ctiveVdbeCnt>0 |
114e0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
114f0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
11500 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
11510 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
11520 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
11530 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
11540 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
11550 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
11560 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
11570 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
11580 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
11590 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
115a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
115b0 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
115c0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
115d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
115e0 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
115f0 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
11600 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
11610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
11620 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11630 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11640 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11650 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11660 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11670 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11680 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11690 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
116a0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
116b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
116c0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
116d0 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
116e0 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
116f0 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
11700 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
11710 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11720 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11730 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11740 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11750 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11760 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11770 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11780 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11790 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
117a0 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
117b0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
117c0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
117d0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
117e0 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
117f0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
11800 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
11810 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
11820 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
11830 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
11840 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
11850 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
11860 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
11870 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
11880 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
11890 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
118a0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
118b0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
118c0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
118d0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
118e0 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
118f0 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
11900 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
11910 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
11920 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
11930 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
11940 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
11950 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
11960 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
11970 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
11980 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11990 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
119a0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
119b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
119c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
119d0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
119e0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
119f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11a00 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
11a10 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31  tStr(db->pErr,-1
11a20 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49  ,p->zErrMsg,SQLI
11a30 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
11a40 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
11a50 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11a60 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
11a70 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
11a80 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->rc;.      sqli
11a90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11aa0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
11ab0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11ac0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11ad0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
11ae0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
11af0 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
11b00 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
11b10 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
11b20 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
11b30 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
11b40 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
11b50 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
11b60 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
11b70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
11b80 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
11b90 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
11ba0 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
11bb0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
11bc0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
11bd0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
11be0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
11bf0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
11c00 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
11c10 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
11c20 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
11c30 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
11c40 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
11c50 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
11c60 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
11c70 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11c80 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
11c90 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
11ca0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
11cb0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
11cc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11cd0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
11ce0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11cf0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
11d00 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
11d10 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
11d20 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
11d30 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
11d40 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
11d50 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
11d60 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
11d70 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
11d80 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
11d90 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
11da0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
11db0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
11dc0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
11dd0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
11de0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
11df0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11e00 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
11e10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11e20 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
11e30 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
11e40 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
11e50 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
11e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
11e70 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
11e80 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
11e90 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
11ea0 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
11eb0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
11ec0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
11ed0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
11ee0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
11ef0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
11f00 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
11f10 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
11f20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
11f30 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
11f40 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
11f50 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
11f60 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
11f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
11f80 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
11f90 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
11fa0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
11fb0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
11fc0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
11fd0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
11fe0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
11ff0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
12000 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12010 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
12020 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
12030 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
12040 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
12050 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12060 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
12070 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
12080 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12090 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
120a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
120b0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
120c0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
120d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
120e0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
120f0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
12100 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
12110 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
12120 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
12130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12140 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
12150 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
12160 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
12170 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
12180 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
12190 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
121a0 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
121b0 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
121c0 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
121d0 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
121e0 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
121f0 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
12200 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
12210 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
12220 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
12230 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12240 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
12250 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
12260 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
12270 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12280 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
12290 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
122a0 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
122b0 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
122c0 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
122d0 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
122e0 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29  k&(((u32)1)<<i))
122f0 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
12300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
12310 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
12320 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
12330 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
12340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12350 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
12360 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12370 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
12380 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
12390 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
123a0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
123b0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65  argument..** The
123c0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
123d0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
123e0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
123f0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
12400 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
12410 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
12420 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
12430 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
12440 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
12450 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12460 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
12470 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12480 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  teObject(sqlite3
12490 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
124a0 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
124b0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
124c0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
124d0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
124e0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
124f0 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
12500 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
12510 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
12520 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
12530 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
12540 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
12550 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
12560 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
12570 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
12580 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
12590 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
125a0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
125b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
125c0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
125d0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
125e0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
125f0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
12600 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12610 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
12620 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12630 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
12640 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12650 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
12660 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
12670 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Free);.  sqlite3
12680 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
12690 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
126a0 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
126b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
126c0 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
126d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
126e0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
126f0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
12700 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
12710 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
12720 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
12730 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
12740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
12750 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
12760 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
12770 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
12780 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
12790 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
127a0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
127b0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
127c0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
127d0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
127e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
127f0 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c  DeleteObject(db,
12800 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   p);.}../*.** Ma
12810 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
12820 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
12830 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
12840 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
12850 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
12860 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
12870 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
12880 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
12890 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
128a0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
128b0 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
128c0 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
128d0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
128e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
128f0 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
12900 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
12910 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
12920 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
12930 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
12940 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
12950 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
12960 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
12970 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
12980 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12990 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
129a0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
129b0 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
129c0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
129d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
129e0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
129f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
12a00 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
12a10 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
12a20 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
12a30 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
12a40 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
12a50 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12a70 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
12a80 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
12a90 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
12aa0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
12ab0 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
12ac0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
12ad0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
12ae0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
12af0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
12b00 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
12b10 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12b20 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
12b30 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f  packed(p->pCurso
12b40 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
12b50 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
12b60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
12b70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e  turn rc;.    p->
12b80 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d  lastRowid = p->m
12b90 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20  ovetoTarget;.   
12ba0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
12bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12bc0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d  UPT_BKPT;.    p-
12bd0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
12be0 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
12bf0 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
12c00 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
12c10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
12c20 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
12c30 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
12c40 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
12c50 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TALE;.  }else if
12c60 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72  ( ALWAYS(p->pCur
12c70 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  sor) ){.    int 
12c80 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
12c90 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
12ca0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
12cb0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
12cc0 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
12cd0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12ce0 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
12cf0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
12d00 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
12d10 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
12d20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
12d30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12d50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
12d60 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
12d70 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
12d80 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12da0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
12db0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12dc0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
12dd0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
12de0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12df0 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
12e00 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
12e10 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
12e20 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
12e30 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
12e40 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
12e50 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
12e60 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
12e70 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
12e80 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
12e90 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
12ea0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
12eb0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
12ec0 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
12ed0 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
12ee0 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
12ef0 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
12f00 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
12f10 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
12f20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
12f30 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
12f40 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
12f50 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
12f60 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
12f70 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
12f80 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
12f90 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
12fa0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
12fb0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
12fc0 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
12fd0 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
12fe0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
12ff0 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
13000 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
13010 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
13020 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
13030 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
13040 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
13050 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
13060 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
13070 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
13080 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
13090 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
130a0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
130b0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
130c0 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
130d0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
130e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
130f0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13100 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13110 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
13120 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13130 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
13140 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13150 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13180 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13190 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
131b0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
131c0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
131d0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
131e0 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
131f0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13200 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
13230 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13240 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
13250 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
13260 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13270 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13280 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
13290 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
132a0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
132b0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
132c0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
132d0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
132e0 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
132f0 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
13300 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13310 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
13320 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
13330 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
13360 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
13370 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
13380 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
13390 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
133a0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
133b0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
133c0 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
133d0 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
133e0 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
133f0 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
13400 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
13410 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
13420 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
13430 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
13440 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
13450 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13460 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
13470 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
13480 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
13490 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
134a0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
134b0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
134c0 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
134d0 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
134e0 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
134f0 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
13500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13510 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
13520 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
13530 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
13540 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
13550 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
13560 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
13570 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
13580 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
13590 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
135a0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
135b0 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
135c0 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
135d0 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
135e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
135f0 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u32)i;.    }.   
13600 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
13610 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
13620 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
13630 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
13640 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
13650 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
13660 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
13670 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
13680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13690 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
136a0 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
136b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
136c0 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
136d0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
136e0 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
136f0 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
13700 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
13710 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
13720 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
13730 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
13740 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
13750 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
13760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
13770 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
13780 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
13790 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
137a0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
137b0 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
137c0 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
137d0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
137e0 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
137f0 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ero;.  }.  asser
13800 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74  t( n>=0 );.  ret
13810 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
13820 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
13830 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
13840 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
13850 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
13860 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
13870 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
13880 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
13890 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
138a0 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
138b0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
138c0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
138d0 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
138e0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
138f0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
13900 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13910 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
13920 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
13930 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
13940 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
13950 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
13960 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
13970 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
13980 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
13990 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
139a0 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
139b0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
139c0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
139d0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
139e0 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
139f0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
13a00 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
13a10 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
13a20 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
13a30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
13a40 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
13a50 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
13a60 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
13a70 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
13a80 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
13a90 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
13aa0 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
13ab0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
13ac0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
13ad0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
13ae0 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
13af0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
13b00 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
13b10 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
13b20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
13b30 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
13b40 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
13b50 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
13b60 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
13b70 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
13b80 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
13b90 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
13ba0 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
13bb0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
13bc0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
13bd0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
13be0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
13bf0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
13c00 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
13c10 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
13c20 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
13c30 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
13c40 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
13c50 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
13c60 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
13c70 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
13c80 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
13c90 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
13ca0 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
13cb0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
13cc0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
13cd0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
13ce0 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
13cf0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
13d00 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
13d10 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
13d20 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
13d30 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
13d40 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
13d50 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
13d60 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
13d70 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
13d80 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
13d90 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
13da0 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
13db0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
13dc0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
13dd0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
13de0 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
13df0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
13e00 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
13e10 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
13e20 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
13e30 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
13e40 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
13e50 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
13e60 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
13e70 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
13e80 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
13e90 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
13ea0 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
13eb0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
13ec0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
13ed0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
13ee0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
13ef0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
13f00 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
13f10 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
13f20 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
13f30 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
13f40 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
13f50 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
13f60 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
13f70 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
13f80 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
13f90 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
13fa0 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
13fb0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
13fc0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
13fd0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
13fe0 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
13ff0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14000 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
14010 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
14020 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
14030 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
14040 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
14050 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
14060 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
14070 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
14080 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
14090 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
140a0 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
140b0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
140c0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
140d0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
140e0 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
140f0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
14100 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
14110 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
14120 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
14130 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
14140 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
14150 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
14160 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
14170 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
14180 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
14190 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
141a0 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
141b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
141c0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
141d0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
141e0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
141f0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
14200 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61    nBuf must alwa
14210 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65  ys be.** large e
14220 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
14230 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20  e entire field. 
14240 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
14250 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c  field is.** a bl
14260 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66  ob with a zero-f
14270 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e  illed tail, then
14280 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20   buf[] might be 
14290 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a  just the right.*
142a0 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65  * size to hold e
142b0 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74  verything except
142c0 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69   for the zero-fi
142d0 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62  lled tail.  If b
142e0 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  uf[].** is only 
142f0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
14300 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ld the non-zero 
14310 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c  prefix, then onl
14320 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  y write that.** 
14330 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b  prefix into buf[
14340 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d  ].  But if buf[]
14350 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
14360 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68   to hold both th
14370 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20  e.** prefix and 
14380 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72  the tail then wr
14390 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61  ite the prefix a
143a0 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20  nd set the tail 
143b0 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e  to all.** zeros.
143c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
143d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
143e0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
143f0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
14400 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
14410 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
14420 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
14430 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
14440 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
14450 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
14460 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
14470 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
14480 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14490 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
144a0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20  , int nBuf, Mem 
144b0 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
144c0 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73  format){.  u32 s
144d0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
144e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
144f0 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f  pe(pMem, file_fo
14500 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e  rmat);.  u32 len
14510 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
14520 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
14530 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
14540 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
14550 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
14560 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
14570 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
14580 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
14590 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
145a0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b  zeof(pMem->r) );
145b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
145c0 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65  , &pMem->r, size
145d0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
145e0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
145f0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
14600 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
14610 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
14620 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
14630 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14640 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
14650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
14660 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a  n<=(u32)nBuf );.
14670 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
14680 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
14690 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
146a0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
146b0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
146c0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
146d0 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
146e0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
146f0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
14700 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
14710 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
14720 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
14730 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
14740 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
14750 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14760 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14770 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
14780 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
14790 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
147a0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
147b0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
147c0 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
147d0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
147e0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
147f0 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
14800 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ero;.      asser
14810 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20  t( nBuf>=0 );.  
14820 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75      if( len > (u
14830 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  32)nBuf ){.     
14840 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42     len = (u32)nB
14850 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
14860 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
14870 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
14880 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
14890 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
148a0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
148b0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
148c0 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
148d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
148e0 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
148f0 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
14900 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
14910 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
14920 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
14930 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
14940 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
14950 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
14960 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  ad..*/ .u32 sqli
14970 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
14980 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
14990 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
149a0 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
149b0 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
149c0 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
149d0 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
149e0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
149f0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
14a00 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
14a30 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
14a40 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
14a50 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
14a60 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
14a70 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
14a80 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
14a90 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
14aa0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
14ab0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
14ac0 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
14ad0 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
14ae0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14af0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
14b00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14b10 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
14b20 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14b30 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
14b40 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
14b50 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
14b60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14b70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14b80 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
14b90 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
14ba0 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
14bb0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14bc0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
14bd0 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
14be0 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
14bf0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14c00 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14c10 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
14c20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
14c30 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
14c40 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14c50 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
14c60 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
14c70 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
14c80 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
14c90 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
14ca0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
14cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
14cc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
14cd0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
14ce0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
14cf0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
14d00 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
14d10 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
14d20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
14d30 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
14d40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14d50 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14d60 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
14d70 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
14d80 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14d90 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
14da0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
14db0 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
14dc0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
14dd0 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
14de0 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
14df0 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
14e00 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
14e10 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
14e20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14e30 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
14e40 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14e50 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14e60 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
14e70 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
14e80 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
14e90 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
14ea0 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
14eb0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
14ec0 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
14ed0 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
14ee0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
14ef0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14f00 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
14f10 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
14f20 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
14f30 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
14f40 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
14f50 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
14f60 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
14f70 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
14f80 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
14f90 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
14fa0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
14fb0 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
14fc0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
14fd0 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
14fe0 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
14ff0 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
15000 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
15010 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
15020 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
15030 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
15040 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
15050 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
15060 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
15070 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
15080 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
15090 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
150a0 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
150b0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
150c0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
150d0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
150e0 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
150f0 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
15100 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
15110 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
15120 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
15130 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
15140 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
15150 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
15160 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
15170 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
15180 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
15190 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
151a0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
151b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
151c0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
151d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
151e0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
151f0 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
15200 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
15210 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
15220 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
15230 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
15240 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
15250 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
15260 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
15270 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
15280 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
15290 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
152a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
152b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
152c0 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
152d0 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
152e0 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
152f0 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
15300 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
15310 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
15320 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
15330 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
15340 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
15350 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75  fault: {.      u
15360 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  32 len = (serial
15370 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
15380 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
15390 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
153a0 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
153b0 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
153c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
153d0 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
153e0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
153f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
15400 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
15410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15420 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15430 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
15440 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
15450 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
15460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15470 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
15480 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
15490 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
154a0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
154b0 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a  y[], parse the.*
154c0 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  * record into a 
154d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
154e0 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
154f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
15500 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  * that structure
15510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
15520 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  ing function mig
15530 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61  ht provide szSpa
15540 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ce bytes of memo
15550 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70  ry.** space at p
15560 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61  Space.  This spa
15570 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ce can be used t
15580 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
15590 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65  ned.** VDbeParse
155a0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
155b0 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  e if it is large
155c0 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20   enough.  If it 
155d0 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e  is.** not big en
155e0 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f  ough, space is o
155f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
15600 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
15610 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
15620 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  d structure shou
15630 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20  ld be closed by 
15640 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  a call to.** sql
15650 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
15660 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a  packedRecord()..
15670 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  */ .UnpackedReco
15680 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52  rd *sqlite3VdbeR
15690 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
156a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
156b0 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
156c0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
156d0 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
156e0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
156f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15700 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
15710 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
15720 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
15730 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
15740 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
15750 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
15760 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
15770 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
15780 74 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65  to hold the obje
15790 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  ct */.  int szSp
157a0 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ace            /
157b0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
157c0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  [] in bytes */.)
157d0 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
157e0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
157f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15800 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55  char *)pKey;.  U
15810 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15820 3b 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b  ;  /* The unpack
15830 65 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 77  ed record that w
15840 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f  e will return */
15850 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
15860 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
15870 20 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f   space needed to
15880 20 68 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65   hold p, in byte
15890 73 20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20  s */.  int d;.  
158a0 75 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75  u32 idx;.  u16 u
158b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
158c0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
158d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
158e0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
158f0 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  Mem;.  int nOff;
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15910 63 72 65 61 73 65 20 70 53 70 61 63 65 20 62 79  crease pSpace by
15920 20 74 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d   this much to 8-
15930 62 79 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f  byte align it */
15940 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  .  .  /*.  ** We
15950 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
15960 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
15970 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
15980 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
15990 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
159a0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
159b0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
159c0 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
159d0 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
159e0 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
159f0 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
15a00 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
15a10 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
15a20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
15a30 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
15a40 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
15a50 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
15a60 20 70 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b   pSpace += nOff;
15a70 0a 20 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f  .  szSpace -= nO
15a80 66 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  ff;.  nByte = RO
15a90 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
15aa0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
15ab0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
15ac0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
15ad0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
15ae0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
15af0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
15b00 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
15b10 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
15b20 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
15b30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
15b40 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46   UNPACKED_NEED_F
15b50 52 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e  REE | UNPACKED_N
15b60 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
15b70 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
15b80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70  npackedRecord*)p
15b90 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  Space;.    p->fl
15ba0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
15bb0 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
15bc0 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
15bd0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
15be0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
15bf0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
15c00 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20   p->aMem = pMem 
15c10 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
15c20 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
15c30 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
15c40 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ))];.  assert( E
15c50 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
15c60 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
15c70 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
15c80 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
15c90 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
15ca0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
15cb0 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
15cc0 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
15cd0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
15ce0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
15cf0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
15d00 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
15d10 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
15d20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
15d30 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
15d40 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
15d50 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d  fo->db;.    pMem
15d60 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ->flags = 0;.   
15d70 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
15d80 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
15d90 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
15da0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15db0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
15dc0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
15dd0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
15de0 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
15df0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
15e00 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
15e10 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
15e20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
15e30 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
15e40 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
15e50 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
15e60 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  rd object..*/.vo
15e70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
15e80 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
15e90 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  rd(UnpackedRecor
15ea0 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  d *p){.  int i;.
15eb0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20    Mem *pMem;..  
15ec0 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
15ed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
15ee0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
15ef0 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20  ED_DESTROY );.  
15f00 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d  for(i=0, pMem=p-
15f10 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65  >aMem; i<p->nFie
15f20 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29  ld; i++, pMem++)
15f30 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70  {.    /* The unp
15f40 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20  acked record is 
15f50 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74  always construct
15f60 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
15f70 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61   sqlite3VdbeUnpa
15f80 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
15f90 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68  ion above, which
15fa0 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a   makes all.    *
15fb0 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  * strings and bl
15fc0 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64  obs static.  And
15fd0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65   none of the ele
15fe0 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  ments are.    **
15ff0 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65   ever transforme
16000 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
16010 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f  ever anything to
16020 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a   delete..    */.
16030 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
16040 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
16050 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
16060 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  em);.  }.  if( p
16070 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16080 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a  ED_NEED_FREE ){.
16090 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
160a0 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  e(p->pKeyInfo->d
160b0 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
160c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
160d0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
160e0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
160f0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
16100 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
16110 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
16120 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
16130 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
16140 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
16150 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
16160 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16170 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
16180 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
16190 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
161a0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
161b0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
161c0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
161d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
161e0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
161f0 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
16200 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
16210 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
16220 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16230 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
16240 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
16250 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
16260 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
16270 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
16280 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
16290 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
162a0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
162b0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
162c0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
162d0 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
162e0 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
162f0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16300 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
16310 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
16320 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
16330 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
16340 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
16350 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
16360 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16370 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
16380 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
16390 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
163a0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
163b0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
163c0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
163d0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
163e0 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
163f0 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
16400 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
16410 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
16420 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
16430 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
16440 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
16450 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
16460 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
16470 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
16480 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
16490 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
164a0 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
164b0 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
164c0 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
164d0 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
164e0 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
164f0 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
16500 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
16510 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
16520 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
16530 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
16540 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
16550 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
16560 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
16570 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
16580 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
16590 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
165a0 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
165b0 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
165c0 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
165d0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
165e0 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
165f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
16600 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
16610 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
16620 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
16630 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
16640 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
16650 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
16660 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
16670 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
16680 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
16690 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
166a0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
166b0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
166c0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
166d0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
166e0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
166f0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
16700 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
16710 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
16720 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16730 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
16740 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
16750 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
16760 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
16770 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16780 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
16790 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
167a0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
167b0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
167c0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
167d0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
167e0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
167f0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
16800 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
16810 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
16820 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
16830 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
16840 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
16850 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
16860 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
16870 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61  A_ONLY( mem1.zMa
16880 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
16890 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
168a0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
168b0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
168c0 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
168d0 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
168e0 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
168f0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
16900 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
16910 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
16920 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
16930 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
16940 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
16950 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
16960 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
16970 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
16980 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
16990 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
169a0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
169b0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
169c0 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
169d0 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
169e0 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
169f0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
16a00 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
16a10 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
16a20 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
16a30 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
16a40 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
16a50 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
16a60 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
16a70 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
16a80 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
16a90 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
16aa0 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
16ab0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16ac0 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
16ad0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
16ae0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
16af0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66  1 = szHdr1;.  if
16b00 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
16b10 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
16b20 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73  E_ROWID ){.    s
16b30 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e  zHdr1--;.  }.  n
16b40 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
16b50 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
16b60 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
16b70 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
16b80 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
16b90 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
16ba0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
16bb0 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
16bc0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
16bd0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
16be0 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
16bf0 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
16c00 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
16c10 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d   );.    if( d1>=
16c20 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
16c30 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16c40 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
16c50 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
16c60 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
16c70 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
16c80 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
16c90 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
16ca0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
16cb0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
16cc0 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
16cd0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
16ce0 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
16cf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
16d00 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
16d10 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
16d20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c                i<
16d40 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
16d50 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
16d60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
16d70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16d80 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
16d90 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
16da0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
16db0 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68      /* Invert th
16dc0 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61  e result if we a
16dd0 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f  re using DESC so
16de0 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
16df0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
16e00 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
16e10 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49  <nField && pKeyI
16e20 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
16e30 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
16e40 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
16e50 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66      .      /* If
16e60 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
16e70 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
16e80 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
16e90 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
16ea0 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69       ** rowid fi
16eb0 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
16ec0 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
16ed0 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
16ee0 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20  g and set .     
16ef0 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69   ** pPKey2->rowi
16f00 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  d to the value o
16f10 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
16f20 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65  d in (pKey1, nKe
16f30 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  y1)..      ** Th
16f40 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
16f50 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
16f60 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
16f70 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32       if( (pPKey2
16f80 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16f90 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
16fa0 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
16fb0 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
16fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
16fd0 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63  x1==szHdr1 && rc
16fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
16ff0 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  rt( mem1.flags &
17000 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
17010 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
17020 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
17030 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
17040 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f        pPKey2->ro
17050 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
17060 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
17070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17080 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
17090 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
170a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
170b0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
170c0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
170d0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
170e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
170f0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
17100 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
17110 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
17120 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
17130 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
17140 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17150 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
17160 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17170 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
17180 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
17190 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
171a0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
171b0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
171c0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
171d0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
171e0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
171f0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
17200 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
17210 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
17220 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
17230 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
17240 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
17250 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
17260 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
17270 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
17280 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
17290 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
172a0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
172b0 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
172c0 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
172d0 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
172e0 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
172f0 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
17300 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
17310 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
17320 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
17330 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
17340 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
17350 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
17360 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17370 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
17380 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
17390 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
173a0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
173b0 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
173c0 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
173d0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
173e0 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
173f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
17400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
17410 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
17420 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
17430 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
17440 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
17450 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
17460 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
17470 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
17480 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
17490 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
174a0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
174b0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
174c0 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
174d0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
174e0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
174f0 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
17500 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
17510 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
17520 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
17530 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
17540 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
17550 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
17560 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
17570 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
17580 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17590 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
175a0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
175b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
175c0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
175d0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
175e0 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
175f0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
17600 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
17610 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
17620 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
17630 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
17640 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
17650 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
17660 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17670 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
17680 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17690 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
176a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
176b0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
176c0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
176d0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
176e0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
176f0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
17700 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
17710 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17720 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
17730 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
17740 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
17750 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17760 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
17770 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
17780 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
17790 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
177a0 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
177b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
177c0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
177d0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  lid(pCur) );.  r
177e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
177f0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
17800 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
17810 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
17820 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72  K );     /* pCur
17830 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
17840 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
17850 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  ot fail */.  ass
17860 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
17870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
17880 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
17890 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
178a0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
178b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
178c0 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65  ex entry */.  me
178d0 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
178e0 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
178f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
17900 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
17910 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
17920 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
17930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
17950 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
17960 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
17970 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
17980 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
17990 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
179a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
179b0 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
179c0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
179d0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
179e0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
179f0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
17a00 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
17a10 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
17a20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
17a30 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
17a40 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
17a50 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
17a60 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
17a70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
17a80 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
17a90 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
17aa0 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
17ab0 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
17ac0 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
17ad0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17ae0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
17af0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17b00 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
17b10 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17b20 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
17b30 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17b40 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
17b50 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
17b60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17b70 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
17b80 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17b90 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
17ba0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17bb0 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
17bc0 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
17bd0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
17be0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
17bf0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17c00 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17c10 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
17c20 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
17c30 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
17c40 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
17c50 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
17c60 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
17c70 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17c80 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
17c90 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
17ca0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17cb0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
17cc0 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
17cd0 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
17ce0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
17cf0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
17d00 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17d10 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
17d20 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
17d30 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
17d40 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
17d50 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17d60 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
17d80 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17d90 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17da0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
17db0 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
17dc0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
17dd0 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
17de0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
17df0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
17e00 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
17e10 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
17e20 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30  se( m.zMalloc!=0
17e30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
17e40 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17e60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
17e70 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
17e80 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
17e90 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
17ea0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
17eb0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
17ec0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
17ed0 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
17ee0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
17ef0 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
17f00 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
17f10 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
17f20 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
17f30 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
17f40 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
17f50 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
17f60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17f70 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
17f80 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
17f90 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
17fa0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
17fb0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
17fc0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
17fd0 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
17fe0 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
17ff0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
18000 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18010 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
18020 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
18030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
18040 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
18050 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
18060 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
18070 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
18080 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
18090 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
180a0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
180b0 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75  ompare(.  VdbeCu
180c0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
180d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
180e0 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
180f0 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
18100 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
18110 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
18120 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
18130 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  ey to compare ag
18140 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ainst */.  int *
18150 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
18160 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18170 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
18180 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
18190 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
181a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
181b0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
181c0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
181d0 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
181e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
181f0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
18200 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
18210 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18220 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
18230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
18240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
18250 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
18260 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
18270 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
18280 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
18290 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
182a0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
182b0 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
182c0 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a   of the say.  **
182d0 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
182e0 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
182f0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
18300 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
18310 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
18320 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
18330 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
18340 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
18350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18370 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
18380 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
18390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
183a0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
183b0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
183c0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
183d0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
183e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
183f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18400 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20  Unpacked->flags 
18410 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
18420 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65  E_ROWID );.  *re
18430 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
18440 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
18450 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
18460 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18470 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
18480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18490 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
184a0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
184b0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
184c0 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
184d0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
184e0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
184f0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
18500 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
18510 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
18520 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
18530 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
18540 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
18550 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18560 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18570 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
18580 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
18590 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
185a0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
185b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
185c0 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
185d0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
185e0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
185f0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
18600 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
18610 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18620 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
18630 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
18640 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
18650 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
18660 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18670 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
18680 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
18690 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
186a0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
186b0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
186c0 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
186d0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
186e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
186f0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
18700 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
18710 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
18720 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
18730 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
18740 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
18750 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
18760 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
18770 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
18780 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
18790 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
187a0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
187b0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
187c0 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
187d0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
187e0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
187f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18800 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
18810 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
18820 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
18830 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
18840 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
18850 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
18860 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
18870 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18880 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
18890 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
188a0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
188b0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
188c0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
188d0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
188e0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
188f0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
18900 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
18910 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
18920 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
18930 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
18940 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
18950 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
18960 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
18970 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
18980 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
18990 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
189a0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
189b0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
189c0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
189d0 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
189e0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
189f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
18a00 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
18a10 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
18a20 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
18a30 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
18a40 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
18a50 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
18a60 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
18a70 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
18a80 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
18a90 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
18aa0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
18ab0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
18ac0 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
18ad0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
18ae0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
18af0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18b00 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
18b10 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
18b20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
18b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18b40 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
18b50 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
18b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
18b70 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
18b80 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
18b90 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
18ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18bb0 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a  StoreType((Mem *
18bc0 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  )pRet);.      }.
18bd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
18be0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
18bf0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
18c00 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
18c10 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
18c20 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
18c30 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
18c40 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
18c50 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
18c60 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
18c70 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
18c80 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
18c90 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
18ca0 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
18cb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
18cc0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
18cd0 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
18ce0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
18cf0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
18d00 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
18d10 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
18d20 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
18d30 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
18d40 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
18d50 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  }.}..#ifdef SQLI
18d60 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
18d70 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49  ATE_HOOK./*.** I
18d80 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
18d90 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
18da0 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
18db0 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
18dc0 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
18dd0 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
18de0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
18df0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
18e00 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
18e10 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
18e20 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
18e30 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
18e40 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
18e50 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
18e60 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
18e70 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
18e80 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
18e90 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
18ea0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
18eb0 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
18ec0 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
18ed0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ef0 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
18f00 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
18f10 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
18f20 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
18f30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
18f40 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
18f50 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
18f60 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
18f90 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
18fa0 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
18fb0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
18fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
18fd0 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
18fe0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
19010 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
19020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19030 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
19040 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
19050 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
19080 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
19090 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
190a0 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
190b0 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
190c0 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
190d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
190e0 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
190f0 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
19100 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b  pPreUpdate==0 );
19110 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70  .  memset(&preup
19120 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  date, 0, sizeof(
19130 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69  PreUpdate));.  i
19140 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  f( op==SQLITE_UP
19150 44 41 54 45 20 29 7b 0a 20 20 20 20 69 4b 65 79  DATE ){.    iKey
19160 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
19170 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ].u.i;.  }else{.
19180 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79      iKey2 = iKey
19190 31 3b 0a 20 20 7d 0a 0a 20 20 70 72 65 75 70 64  1;.  }..  preupd
191a0 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65  ate.v = v;.  pre
191b0 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43  update.pCsr = pC
191c0 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  sr;.  preupdate.
191d0 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70  op = op;.  preup
191e0 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69  date.iNewReg = i
191f0 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Reg;.  preupdate
19200 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62  .keyinfo.db = db
19210 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
19220 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28  yinfo.enc = ENC(
19230 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65  db);.  preupdate
19240 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20  .keyinfo.nField 
19250 3d 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 0a  = pCsr->nField;.
19260 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
19270 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65  1 = iKey1;.  pre
19280 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69  update.iKey2 = i
19290 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74  Key2;.  preupdat
192a0 65 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e  e.iPKey = pTab->
192b0 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50  iPKey;..  db->pP
192c0 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
192d0 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
192e0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
192f0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
19300 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
19310 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
19320 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
19330 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
19340 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19350 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
19360 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
19370 74 65 2e 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a  te.pUnpacked ){.
19380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
19390 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
193a0 6f 72 64 28 70 72 65 75 70 64 61 74 65 2e 70 55  ord(preupdate.pU
193b0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20  npacked);.  }.  
193c0 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 70 4e  if( preupdate.pN
193d0 65 77 55 6e 70 61 63 6b 65 64 20 29 7b 0a 20 20  ewUnpacked ){.  
193e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
193f0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
19400 64 28 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77  d(preupdate.pNew
19410 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 7d 0a 20  Unpacked);.  }. 
19420 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
19430 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
19440 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19450 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
19460 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
19470 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
19480 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
19490 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
194a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
194b0 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
194c0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
194d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
194e0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
194f0 2a 2f 0a                                         */.