/ Hex Artifact Content
Login

Artifact 88671caaee3ef9c5e600486b3961c395bc4ac493:


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 70 2d 3e 62 74 72 65 65 4d  */.    p->btreeM
0ff0: 61 73 6b 20 3d 20 7e 28 79 44 62 4d 61 73 6b 29  ask = ~(yDbMask)
1000: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
1010: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 70  LITE_DEBUG.  pOp
1020: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1030: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
1040: 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 73 71  eAddopTrace ) sq
1050: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
1060: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
1070: 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ]);.#endif.#ifde
1080: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1090: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
10a0: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
10b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
10c0: 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n i;.}.int sqlit
10d0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62  e3VdbeAddOp0(Vdb
10e0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  e *p, int op){. 
10f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1100: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1110: 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74   0, 0, 0);.}.int
1120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1130: 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p1(Vdbe *p, int 
1140: 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72  op, int p1){.  r
1150: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1160: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1170: 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  1, 0, 0);.}.int 
1180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1190: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  2(Vdbe *p, int o
11a0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
11b0: 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  2){.  return sql
11c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
11d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29  , op, p1, p2, 0)
11e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
11f0: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1200: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1210: 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65  alue as a pointe
1220: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1230: 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56  3VdbeAddOp4(.  V
1240: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1250: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1260: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1270: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1280: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1290: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
12a0: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
12b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
12c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
12d0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
12e0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
12f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1310: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
1330: 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f  ,    /* The P4 o
1340: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1350: 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20  p4type          
1360: 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79  /* P4 operand ty
1370: 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  pe */.){.  int a
1380: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1390: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
13a0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71  1, p2, p3);.  sq
13b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
13c0: 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20  4(p, addr, zP4, 
13d0: 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72  p4type);.  retur
13e0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
13f0: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1400: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1410: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
1420: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
1430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1440: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1460: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1470: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1480: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1490: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
14a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
14d0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
14e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
14f0: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1500: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1510: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1520: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1540: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1550: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
1560: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1580: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1590: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
15a0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
15b0: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
15c0: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
15d0: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
15e0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
15f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1600: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
1610: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1620: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1630: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
1640: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1650: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
1660: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1670: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
1680: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
1690: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
16a0: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
16b0: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
16c0: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
16d0: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
16e0: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
16f0: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
1700: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
1710: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
1720: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
1730: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
1740: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
1750: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
1760: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
1770: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
1780: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
1790: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
17a0: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
17b0: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
17c0: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
17d0: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
17e0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
17f0: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
1800: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
1810: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
1820: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
1830: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
1840: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
1850: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1860: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1870: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
1880: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
1890: 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b    i = p->nLabel+
18a0: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  +;.  assert( p->
18b0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
18c0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
18d0: 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  i>=p->nLabelAllo
18e0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  c ){.    int n =
18f0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1900: 32 20 2b 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c  2 + 5;.    p->aL
1910: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  abel = sqlite3Db
1920: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d  ReallocOrFree(p-
1930: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a  >db, p->aLabel,.
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28         n*sizeof(
1970: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1980: 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c      p->nLabelAll
1990: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
19a0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
19b0: 70 2d 3e 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f  p->aLabel)/sizeo
19c0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b  f(p->aLabel[0]);
19d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
19e0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
19f0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
1a00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69   }.  return -1-i
1a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
1a20: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
1a30: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
1a40: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
1a50: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
1a60: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
1a70: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
1a80: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1a90: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
1aa0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
1ab0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ac0: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
1ad0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1ae0: 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e  abel(Vdbe *p, in
1af0: 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20  t x){.  int j = 
1b00: 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20  -1-x;.  assert( 
1b10: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1b20: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1b30: 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a  ssert( j>=0 && j
1b40: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
1b50: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1b60: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a  .    p->aLabel[j
1b70: 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a  ] = p->nOp;.  }.
1b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68  }../*.** Mark th
1b90: 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68  e VDBE as one th
1ba0: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72  at can only be r
1bb0: 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a  un one time..*/.
1bc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1bd0: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65  RunOnlyOnce(Vdbe
1be0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e   *p){.  p->runOn
1bf0: 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23  lyOnce = 1;.}..#
1c00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c10: 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73  UG /* sqlite3Ass
1c20: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f  ertMayAbort() lo
1c30: 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  gic */../*.** Th
1c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
1c50: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72   and function ar
1c60: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
1c70: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  e through all op
1c80: 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64  codes.** in a Vd
1c90: 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  be main program 
1ca0: 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20  and each of the 
1cb0: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72  sub-programs (tr
1cc0: 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a  iggers) it may .
1cd0: 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74  ** invoke direct
1ce0: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
1cf0: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
1d00: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
1d10: 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b  **.**   Op *pOp;
1d20: 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72  .**   VdbeOpIter
1d30: 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20   sIter;.**.**   
1d40: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
1d50: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
1d60: 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d  ;.**   sIter.v =
1d70: 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d90: 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56  / v is of type V
1da0: 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65  dbe* .**   while
1db0: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
1dc0: 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a  ext(&sIter)) ){.
1dd0: 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d  **     // Do som
1de0: 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a  ething with pOp.
1df0: 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69  **   }.**   sqli
1e00: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
1e10: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a   sIter.apSub);.*
1e20: 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  * .*/.typedef st
1e30: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
1e40: 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75  VdbeOpIter;.stru
1e50: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a  ct VdbeOpIter {.
1e60: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e80: 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20  Vdbe to iterate 
1e90: 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f  through the opco
1ea0: 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50  des of */.  SubP
1eb0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20  rogram **apSub; 
1ec0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1ed0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  of subprograms *
1ee0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20  /.  int nSub;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1f10: 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a  ies in apSub */.
1f20: 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20    int iAddr;    
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
1f50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72  instruction to r
1f60: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
1f70: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
1f80: 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69        /* 0 = mai
1f90: 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66  n program, 1 = f
1fa0: 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d  irst sub-program
1fb0: 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74   etc. */.};.stat
1fc0: 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78  ic Op *opIterNex
1fd0: 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29  t(VdbeOpIter *p)
1fe0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d  {.  Vdbe *v = p-
1ff0: 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d  >v;.  Op *pRet =
2000: 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20   0;.  Op *aOp;. 
2010: 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28   int nOp;..  if(
2020: 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75   p->iSub<=p->nSu
2030: 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d  b ){..    if( p-
2040: 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >iSub==0 ){.    
2050: 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a    aOp = v->aOp;.
2060: 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e        nOp = v->n
2070: 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Op;.    }else{. 
2080: 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70       aOp = p->ap
2090: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
20a0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
20b0: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
20c0: 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b-1]->nOp;.    }
20d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
20e0: 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20  iAddr<nOp );..  
20f0: 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d    pRet = &aOp[p-
2100: 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e  >iAddr];.    p->
2110: 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28  iAddr++;.    if(
2120: 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29   p->iAddr==nOp )
2130: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b  {.      p->iSub+
2140: 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64  +;.      p->iAdd
2150: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  r = 0;.    }.  .
2160: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34      if( pRet->p4
2170: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
2180: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
2190: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75   nByte = (p->nSu
21a0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
21b0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
21c0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
21d0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b  (j=0; j<p->nSub;
21e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
21f0: 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d  f( p->apSub[j]==
2200: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
2210: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
2220: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
2230: 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  p->nSub ){.     
2240: 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71     p->apSub = sq
2250: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
2260: 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61  Free(v->db, p->a
2270: 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pSub, nByte);.  
2280: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70        if( !p->ap
2290: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
22a0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
22b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c0: 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e      p->apSub[p->
22d0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e  nSub++] = pRet->
22e0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
22f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2300: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2310: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
2320: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70  * Check if the p
2330: 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e  rogram stored in
2340: 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74   the VM associat
2350: 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d  ed with pParse m
2360: 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41  ay.** throw an A
2370: 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28  BORT exception (
2380: 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74  causing the stat
2390: 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65  ement, but not e
23a0: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
23b0: 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65  n.** to be rolle
23c0: 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f  d back). This co
23d0: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
23e0: 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  if the main prog
23f0: 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75  ram or any.** su
2400: 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61  b-programs conta
2410: 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66  ins any of the f
2420: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2430: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
2440: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2450: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2460: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2470: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69  OP_HaltIfNull wi
2480: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
2490: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
24a0: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
24b0: 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20   OP_Destroy.**  
24c0: 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a   *  OP_VUpdate.*
24d0: 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d  *   *  OP_VRenam
24e0: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43  e.**   *  OP_FkC
24f0: 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d  ounter with P2==
2500: 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  0 (immediate for
2510: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2520: 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  int).**.** Then 
2530: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
2540: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
2550: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
2560: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
2570: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
2580: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2590: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25a0: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
25b0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
25c0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
25d0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
25e0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
25f0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
2600: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
2610: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
2620: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
2630: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2640: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2650: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
2660: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
2670: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
2680: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
2690: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
26a0: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
26b0: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
26c0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  = 0;.  Op *pOp;.
26d0: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
26e0: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49  er;.  memset(&sI
26f0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2700: 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e  Iter));.  sIter.
2710: 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28  v = v;..  while(
2720: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2730: 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29  xt(&sIter))!=0 )
2740: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65  {.    int opcode
2750: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
2760: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2770: 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70  OP_Destroy || op
2780: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2790: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
27a0: 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64 65 66 20  Rename .#ifndef 
27b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
27c0: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20  IGN_KEY.     || 
27d0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f  (opcode==OP_FkCo
27e0: 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31  unter && pOp->p1
27f0: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  ==0 && pOp->p2==
2800: 31 29 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  1) .#endif.     
2810: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
2820: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
2830: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
2840: 20 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70        && (pOp->p
2850: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
2860: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
2870: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
2880: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
2890: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
28a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
28c0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
28d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
28e0: 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74  true if hasAbort
28f0: 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69  ==mayAbort. Or i
2900: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
2910: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a  re occured..  **
2920: 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65   If malloc faile
2930: 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c  d, then the whil
2940: 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d  e() loop above m
2950: 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72  ay not have iter
2960: 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67  ated.  ** throug
2970: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e  h all opcodes an
2980: 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62  d hasAbort may b
2990: 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  e set incorrectl
29a0: 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74  y. Return.  ** t
29b0: 72 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73  rue for this cas
29c0: 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  e to prevent the
29d0: 20 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65   assert() in the
29e0: 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20   callers frame. 
29f0: 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67   ** from failing
2a00: 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2a10: 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   v->db->mallocFa
2a20: 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74  iled || hasAbort
2a30: 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a  ==mayAbort );.}.
2a40: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2a50: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
2a60: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2a70: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
2a80: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72  ../*.** Loop thr
2a90: 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d  ough the program
2aa0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20   looking for P2 
2ab0: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
2ac0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a  negative.** on j
2ad0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
2ae0: 2e 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  .  Each such val
2af0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
2b00: 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c  Resolve the.** l
2b10: 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20  abel by setting 
2b20: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
2b30: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
2b40: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
2b50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2b60: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
2b70: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
2b80: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
2b90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
2ba0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
2bb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
2bc0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
2bd0: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
2be0: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
2bf0: 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65  ction, OP_AggSte
2c00: 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20  p or OP_VFilter 
2c10: 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  opcode. This is 
2c20: 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69  used by .** sqli
2c30: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
2c40: 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56  () to size the V
2c50: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
2c60: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e  y..**.** The Op.
2c70: 6f 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73  opflags field is
2c80: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f   set on all opco
2c90: 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  des..*/.static v
2ca0: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
2cb0: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
2cc0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b   *pMaxFuncArgs){
2cd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2ce0: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
2cf0: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
2d00: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
2d10: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
2d20: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
2d30: 31 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  1;.  for(pOp=p->
2d40: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
2d50: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
2d60: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
2d70: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
2d80: 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61  ..    pOp->opfla
2d90: 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  gs = sqlite3Opco
2da0: 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64  deProperty[opcod
2db0: 65 5d 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  e];.    if( opco
2dc0: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
2dd0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67  || opcode==OP_Ag
2de0: 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69  gStep ){.      i
2df0: 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41  f( pOp->p5>nMaxA
2e00: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2e10: 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65   pOp->p5;.    }e
2e20: 6c 73 65 20 69 66 28 20 28 6f 70 63 6f 64 65 3d  lse if( (opcode=
2e30: 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20  =OP_Transaction 
2e40: 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c  && pOp->p2!=0) |
2e50: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63  | opcode==OP_Vac
2e60: 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  uum ){.      p->
2e70: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69  readOnly = 0;.#i
2e80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e90: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2ea0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2eb0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2ec0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
2ed0: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
2ee0: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
2ef0: 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  p2;.    }else if
2f00: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69  ( opcode==OP_VFi
2f10: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  lter ){.      in
2f20: 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t n;.      asser
2f30: 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d  t( p->nOp - i >=
2f40: 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   3 );.      asse
2f50: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
2f60: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
2f70: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b  ;.      n = pOp[
2f80: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66  -1].p1;.      if
2f90: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
2fa0: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e  MaxArgs = n;.#en
2fb0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
2fc0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
2fd0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
2fe0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
2ff0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3000: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
3010: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f  abel );.      pO
3020: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
3030: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  1-pOp->p2];.    
3040: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
3050: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
3060: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c  aLabel);.  p->aL
3070: 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d  abel = 0;..  *pM
3080: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
3090: 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xArgs;.}../*.** 
30a0: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
30b0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
30c0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
30d0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
30e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
30f0: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
3100: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
3110: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3120: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
3130: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
3140: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3150: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
3160: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
3170: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
3180: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
3190: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
31a0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
31b0: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
31c0: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
31d0: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
31e0: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
31f0: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
3200: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
3210: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
3220: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
3230: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
3240: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3250: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
3260: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
3270: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3280: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
3290: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
32a0: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
32b0: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
32c0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
32d0: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
32e0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
32f0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
3300: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
3310: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
3320: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
3330: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
3340: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
3350: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
3360: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
3370: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
3380: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
3390: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
33a0: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
33b0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
33c0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
33d0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
33e0: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
33f0: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
3400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 74  .  assert( p->bt
3410: 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20  reeMask==0 );.. 
3420: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3430: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3440: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3450: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3460: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3470: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3480: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3490: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
34a0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
34b0: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
34c0: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
34d0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
34e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
34f0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3500: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3510: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3520: 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64   *aOp){.  int ad
3530: 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dr;.  assert( p-
3540: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3550: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3560: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
3570: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  p->nOpAlloc && g
3580: 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b  rowOpArray(p) ){
3590: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
35a0: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
35b0: 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  Op;.  if( ALWAYS
35c0: 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69  (nOp>0) ){.    i
35d0: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
35e0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
35f0: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
3600: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
3610: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
3620: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
3630: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
3640: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
3650: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
3660: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
3670: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
3680: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
3690: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
36a0: 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70 63 6f   && (sqlite3Opco
36b0: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d  deProperty[pOut-
36c0: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
36d0: 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20  _JUMP)!=0 ){.   
36e0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
36f0: 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b  addr + ADDR(p2);
3700: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3710: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3720: 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p2;.      }.   
3730: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
3740: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
3750: 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  t->p4type = P4_N
3760: 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f  OTUSED;.      pO
3770: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
3780: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30      pOut->p5 = 0
3790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
37a0: 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74  DEBUG.      pOut
37b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
37c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
37d0: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
37e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37f0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
3800: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
3810: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
3820: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
3830: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
3840: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
3850: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
3860: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
3870: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
3880: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
3890: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
38a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
38b0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
38c0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
38d0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
38e0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
38f0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
3900: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
3910: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
3920: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
3930: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
3940: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
3950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
3960: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3970: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
3980: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3990: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
39a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
39b0: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
39c0: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76  aOp[addr].p1 = v
39d0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
39e0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
39f0: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72  e of the P2 oper
3a00: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3a10: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3a20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a30: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  is useful for se
3a40: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73  tting a jump des
3a50: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  tination..*/.voi
3a60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3a70: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69  ngeP2(Vdbe *p, i
3a80: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
3a90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3aa0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3ab0: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
3ac0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
3ad0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3ae0: 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p2 = val;.  }.}.
3af0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3b00: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3b10: 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  3 operand for a 
3b20: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
3b30: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3b40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b50: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  3(Vdbe *p, int a
3b60: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3b70: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3b80: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
3b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3ba0: 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  Op>addr ){.    p
3bb0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d  ->aOp[addr].p3 =
3bc0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3bd0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3be0: 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70  lue of the P5 op
3bf0: 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f  erand for the mo
3c00: 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61  st recently.** a
3c10: 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  dded operation..
3c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c30: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
3c40: 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20   *p, u8 val){.  
3c50: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3c60: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
3c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
3c80: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
3c90: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
3ca0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3cb0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
3cc0: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
3cd0: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
3ce0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
3cf0: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
3d00: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
3d10: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
3d20: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
3d30: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3d40: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
3d50: 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28  addr){.  assert(
3d60: 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71   addr>=0 );.  sq
3d70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3d80: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
3d90: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
3da0: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
3db0: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
3dc0: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
3dd0: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
3de0: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
3df0: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
3e00: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
3e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
3e20: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
3e30: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
3e40: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
3e50: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
3e60: 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61  f) && (pDef->fla
3e70: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
3e80: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
3e90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3ea0: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
3eb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
3ec0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
3ed0: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
3ee0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
3ef0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
3f00: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
3f10: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
3f20: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
3f30: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
3f40: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
3f50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
3f60: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
3f70: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
3f80: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
3f90: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
3fa0: 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  4:.      case P4
3fb0: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
3fc0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
3fd0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
3fe0: 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63  NTARRAY:.      c
3ff0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ase P4_KEYINFO_H
4000: 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20  ANDOFF: {.      
4010: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4020: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4040: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
4050: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
4060: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4070: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4080: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
4090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
40a0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
40b0: 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  4_VDBEFUNC: {.  
40c0: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
40d0: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
40e0: 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20  eFunc *)p4;.    
40f0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
4100: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56  lFunction(db, pV
4110: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b  dbeFunc->pFunc);
4120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4130: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4140: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
4150: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
4160: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
4170: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4180: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b  (db, pVdbeFunc);
4190: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
41a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
41b0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
41c0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
41d0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
41e0: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
41f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4210: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
4220: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4230: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b  BytesFreed==0 ){
4240: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4250: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
4260: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
4270: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4280: 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70            Mem *p
4290: 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20   = (Mem*)p4;.   
42a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
42b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
42c0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
42d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
42e0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
42f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4310: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
4320: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4330: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4340: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4350: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
4360: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4380: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
4390: 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
43a0: 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20  ted for aOp and 
43b0: 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c  any p4 values al
43c0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a  located for the.
43d0: 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61  ** opcodes conta
43e0: 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20  ined within. If 
43f0: 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  aOp is not NULL 
4400: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
4410: 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70   contain .** nOp
4420: 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74   entries. .*/.st
4430: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
4440: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
4450: 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20  3 *db, Op *aOp, 
4460: 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20  int nOp){.  if( 
4470: 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70  aOp ){.    Op *p
4480: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d  Op;.    for(pOp=
4490: 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f  aOp; pOp<&aOp[nO
44a0: 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  p]; pOp++){.    
44b0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
44c0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
44d0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
44e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
44f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4500: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
4510: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
4520: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4530: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
4540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
4550: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
4560: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
4570: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4580: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
4590: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
45a0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
45b0: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
45c0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
45d0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
45e0: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
45f0: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
4600: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
4610: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
4620: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
4630: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
4640: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
4650: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
4660: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
4670: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
4680: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
4690: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
46a0: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
46b0: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
46c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
46d0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
46e0: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
46f0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4700: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4710: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4720: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4730: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68   = p->db;.    wh
4740: 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20  ile( N-- ){.    
4750: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4760: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4770: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
4780: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
4790: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
47a0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
47b0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
47c0: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
47d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
47e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
47f0: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4800: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4810: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4820: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4830: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4840: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4850: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4860: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4880: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4890: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
48a0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
48b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
48c0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
48d0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
48e0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
48f0: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4900: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4910: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4920: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4930: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4940: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4950: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4960: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4970: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4980: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4990: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
49a0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
49b0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
49c0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
49d0: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
49e0: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
49f0: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4a00: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4a10: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4a20: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4a30: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4a40: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4a50: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4a60: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4a70: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4a80: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4a90: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4aa0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4ab0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4ac0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4ad0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4ae0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4af0: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4b00: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4b10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4b20: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4b30: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4b40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4b50: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4b60: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4b70: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4b80: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4b90: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4ba0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4bb0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4bc0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4bd0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4be0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4bf0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4c00: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4c10: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4c20: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4c30: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4c40: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4c50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4c60: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4c70: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4c80: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4c90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4ca0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4cb0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4cc0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4cd0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4ce0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4d10: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4d20: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4d30: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4d40: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4d50: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4d60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4d70: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4d80: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4d90: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4da0: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4db0: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4dc0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4dd0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4de0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4df0: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4e00: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4e10: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4e20: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4e30: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4e40: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4e50: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4e60: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
4e70: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4e80: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
4e90: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
4ea0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
4eb0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
4ec0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
4ed0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
4ee0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
4ef0: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
4f00: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
4f10: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
4f20: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
4f30: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4f40: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
4f50: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
4f60: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
4f70: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
4f80: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
4f90: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
4fa0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
4fb0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
4fc0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
4fd0: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
4fe0: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
4ff0: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
5000: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
5010: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
5020: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
5030: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
5040: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
5050: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5060: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5070: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65  llocRaw(0, nByte
5080: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5090: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
50a0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
50b0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38  Info ){.      u8
50c0: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
50d0: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
50e0: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c  *)pKeyInfo, zP4,
50f0: 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29   nByte - nField)
5100: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
5110: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
5120: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5130: 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
5140: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
5150: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5160: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5170: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
5180: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
5190: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
51a0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
51b0: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
51c0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
51d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
51e0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
51f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
5200: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5210: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
5220: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
5230: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
5240: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5250: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5260: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5270: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5280: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5290: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
52a0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
52b0: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
52c0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
52d0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
52e0: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
52f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
5300: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
5310: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
5320: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
5330: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
5340: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
5350: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5360: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5370: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5380: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5390: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
53a0: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
53b0: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
53c0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
53d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
53e0: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
53f0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5400: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
5410: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
5420: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
5430: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
5440: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
5450: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
5460: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
5470: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
5480: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
5490: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
54a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
54b0: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
54c0: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
54d0: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
54e0: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
54f0: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
5500: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
5510: 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ild..*/.void sql
5520: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
5530: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5540: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
5550: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5560: 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
5570: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
5580: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
5590: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
55a0: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
55b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
55c0: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
55d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
55e0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
55f0: 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Op ){.    char *
5600: 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  *pz = &p->aOp[p-
5610: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5620: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
5630: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5640: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5650: 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20  ->db, *pz);.    
5660: 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  *pz = sqlite3VMP
5670: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
5680: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5690: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
56a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
56b0: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
56c0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
56d0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
56e0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
56f0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
5700: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5710: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
5720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5730: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5740: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5750: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5760: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5770: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5790: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
57a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
57b0: 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  z = &p->aOp[p->n
57c0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a  Op-1].zComment;.
57d0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
57e0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73   zFormat);.    s
57f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
5800: 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  db, *pz);.    *p
5810: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
5820: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5830: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5840: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
5850: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
5860: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5870: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5880: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5890: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
58a0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
58b0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
58c0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
58d0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
58e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
58f0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5900: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5910: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5920: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5930: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5940: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5950: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5960: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5970: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5980: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5990: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
59a0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
59b0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
59c0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
59d0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
59e0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
59f0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5a00: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5a10: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5a20: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5a30: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5a40: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5a50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5a60: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5a70: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5a80: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5a90: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5aa0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5ab0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5ac0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5ad0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5ae0: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5af0: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5b00: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5b10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5b20: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5b30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5b40: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5b50: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5b60: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5b70: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5b80: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5b90: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5ba0: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5bb0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5bc0: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5bd0: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5be0: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5bf0: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5c00: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5c10: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5c20: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5c30: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5c40: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5c50: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5c60: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5c70: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5c80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5c90: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5ca0: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5cb0: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5cc0: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5cd0: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5ce0: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5cf0: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
5d00: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5d10: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
5d20: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
5d30: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
5d40: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
5d50: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
5d60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5d70: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
5d80: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
5d90: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
5da0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
5db0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
5dc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
5dd0: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
5de0: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
5df0: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
5e00: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
5e10: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5e20: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5e30: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
5e40: 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  <0 ){.#ifdef SQL
5e50: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
5e60: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30     if( p->nOp==0
5e70: 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f   ) return (VdbeO
5e80: 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69  p*)&dummy;.#endi
5e90: 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  f.    addr = p->
5ea0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
5eb0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
5ec0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
5ed0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
5ee0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
5ef0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5f00: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
5f10: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
5f20: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
5f30: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
5f40: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
5f50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5f60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
5f70: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
5f80: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
5f90: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
5fa0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
5fb0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
5fc0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
5fd0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
5fe0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
5ff0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
6000: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
6010: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
6020: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
6030: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
6040: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
6050: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
6060: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
6070: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
6080: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
6090: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
60a0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
60b0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
60c0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  e P4_KEYINFO_STA
60d0: 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34  TIC:.    case P4
60e0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
60f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
6100: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
6110: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
6120: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  eyInfo;.      sq
6130: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6140: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65  Temp, zTemp, "ke
6150: 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49  yinfo(%d", pKeyI
6160: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
6170: 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53      i = sqlite3S
6180: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
6190: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
61a0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
61b0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
61c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
61d0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
61e0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
61f0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
6200: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
6210: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
6220: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
6230: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
6240: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
6250: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6260: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
6270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6280: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
6290: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
62a0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
62b0: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
62c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
62d0: 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
62e0: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
62f0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
6300: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
6310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6320: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
6330: 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  ], pColl->zName,
6340: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n+1);.          
6350: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  i += n;.        
6360: 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54  }else if( i+4<nT
6370: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
6380: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
6390: 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20  [i],",nil",4);. 
63a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
63b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
63c0: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
63d0: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
63e0: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
63f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
6400: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72  Temp );.      br
6410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6420: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
6430: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6440: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
6450: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
6460: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6470: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f  Temp, zTemp, "co
6480: 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70  llseq(%.20s)", p
6490: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
64a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
64b0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
64c0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
64d0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
64e0: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20  p->p4.pFunc;.   
64f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6500: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6510: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
6520: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
6530: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
6540: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6550: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
6560: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6570: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6580: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
6590: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
65a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65b0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
65c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
65d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
65e0: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
65f0: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
6600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6610: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
6620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6630: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6640: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
6650: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
6660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6670: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
6680: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
6690: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
66a0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  pMem;.      asse
66b0: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
66c0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
66d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
66e0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
66f0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
6700: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
6710: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6720: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
6730: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
6740: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6750: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6760: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
6770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6780: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6790: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
67a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
67b0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
67c0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
67d0: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
67e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
67f0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
6800: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
6810: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
6820: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
6830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6840: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6850: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6860: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
6870: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6880: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
6890: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
68a0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
68b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
68c0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
68d0: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
68e0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
68f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6900: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6910: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
6920: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6930: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6940: 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61   zTemp, "intarra
6950: 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  y");.      break
6960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6970: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
6980: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6990: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
69a0: 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22  zTemp, "program"
69b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
69c0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
69d0: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
69e0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
69f0: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6a00: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6a10: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6a20: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6a30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6a40: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6a50: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6a60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6a70: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6a80: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6a90: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6aa0: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6ab0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6ac0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6ad0: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6ae0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6af0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6b00: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6b10: 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
6b20: 65 20 75 73 69 6e 67 2e 20 20 41 20 6d 61 73 6b  e using.  A mask
6b30: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
6b40: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
6b50: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
6b60: 4d 61 73 6b 20 61 6e 64 20 69 73 20 75 73 65 64  Mask and is used
6b70: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 61 6e 64   for locking and
6b80: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
6b90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6ba0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
6bb0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
6bc0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
6bd0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
6be0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
6bf0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
6c00: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
6c10: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
6c20: 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72  k)*8 );.  p->btr
6c30: 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d  eeMask |= ((yDbM
6c40: 61 73 6b 29 31 29 3c 3c 69 3b 0a 7d 0a 0a 23 69  ask)1)<<i;.}..#i
6c50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6c60: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
6c70: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
6c80: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
6c90: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
6ca0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
6cb0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
6cc0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
6cd0: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
6ce0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
6cf0: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
6d00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
6d10: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
6d20: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
6d30: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
6d40: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
6d50: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
6d60: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
6d70: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
6d80: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
6d90: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
6da0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6db0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
6dc0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
6dd0: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
6de0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
6df0: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
6e00: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
6e10: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
6e20: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
6e30: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
6e40: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
6e50: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
6e60: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
6e70: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
6e80: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
6e90: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
6ea0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
6eb0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
6ec0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
6ed0: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
6ee0: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
6ef0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6f00: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
6f10: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
6f20: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
6f30: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
6f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
6f50: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
6f60: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
6f70: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
6f80: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
6f90: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
6fa0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
6fb0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
6fc0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
6fd0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
6fe0: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
6ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
7000: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
7010: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
7020: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
7030: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
7040: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
7050: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
7060: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
7070: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
7080: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
7090: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
70a0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
70b0: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
70c0: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
70d0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
70e0: 20 44 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61   Db *aDb = db->a
70f0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20  Db;.  int nDb = 
7100: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
7110: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
7120: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
7130: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
7140: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
7150: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 21 3d 30 20  ->btreeMask)!=0 
7160: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7170: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7180: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
7190: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
71a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
71b0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
71c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
71d0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
71e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
71f0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
7200: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
7210: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
7220: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
7230: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
7240: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
7250: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
7260: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7270: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
7280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7290: 20 70 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 61 44   p->db;.  Db *aD
72a0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 69  b = db->aDb;.  i
72b0: 6e 74 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  nt nDb = db->nDb
72c0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  ;..  for(i=0, ma
72d0: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
72e0: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
72f0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
7300: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 62 74 72 65   (mask & p->btre
7310: 65 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57  eMask)!=0 && ALW
7320: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
7330: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
7340: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
7350: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
7360: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
7370: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
7380: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
7390: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
73a0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
73b0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
73c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
73d0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
73e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
73f0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
7400: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
7410: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
7420: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
7430: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
7440: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7450: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
7460: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
7470: 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58  4d %4d %-4s %.2X
7480: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
7490: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
74a0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
74b0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
74c0: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
74d0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  );.  fprintf(pOu
74e0: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
74f0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
7500: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
7510: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
7520: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
7530: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
7540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7550: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e  EBUG.      pOp->
7560: 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e  zComment ? pOp->
7570: 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65  zComment : "".#e
7580: 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e  lse.      "".#en
7590: 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  dif.  );.  fflus
75a0: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
75b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
75c0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
75d0: 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73  em elements.*/.s
75e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
75f0: 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  seMemArray(Mem *
7600: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  p, int N){.  if(
7610: 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d   p && N ){.    M
7620: 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71  em *pEnd;.    sq
7630: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
7640: 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  b;.    u8 malloc
7650: 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  _failed = db->ma
7660: 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
7670: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
7680: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f  reed ){.      fo
7690: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
76a0: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
76b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
76c0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
76d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
76e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
76f0: 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e     for(pEnd=&p[N
7700: 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
7710: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
7720: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
7730: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
7740: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
7750: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
7760: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
7770: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
7780: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
7790: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
77a0: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
77b0: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
77c0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
77d0: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
77e0: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
77f0: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
7800: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
7810: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
7820: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
7830: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
7840: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
7850: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
7860: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
7870: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
7880: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
7890: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
78a0: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
78b0: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
78c0: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
78d0: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
78e0: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
78f0: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
7900: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
7910: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
7920: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
7930: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
7940: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
7950: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
7960: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
7970: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
7980: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
7990: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
79a0: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
79b0: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
79c0: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
79d0: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
79e0: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
79f0: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
7a00: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
7a10: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
7a20: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26     if( p->flags&
7a30: 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e  (MEM_Agg|MEM_Dyn
7a40: 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52  |MEM_Frame|MEM_R
7a50: 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  owSet) ){.      
7a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7a70: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
7a80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a    }else if( p->z
7a90: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
7aa0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7ab0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
7ac0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c  .        p->zMal
7ad0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
7ae0: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
7af0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
7b00: 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f   }.    db->mallo
7b10: 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
7b20: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a  _failed;.  }.}..
7b30: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
7b40: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
7b50: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
7b60: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
7b70: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
7b80: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
7b90: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
7ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
7bb0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
7bc0: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
7bd0: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
7be0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
7bf0: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
7c00: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
7c10: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
7c20: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
7c30: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
7c40: 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  em];.  for(i=0; 
7c50: 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20  i<p->nChildCsr; 
7c60: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
7c70: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
7c80: 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b  p->v, apCsr[i]);
7c90: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
7ca0: 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e  mArray(aMem, p->
7cb0: 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71  nChildMem);.  sq
7cc0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76  lite3DbFree(p->v
7cd0: 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66  ->db, p);.}..#if
7ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7cf0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
7d00: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
7d10: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
7d20: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
7d30: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
7d40: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
7d50: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
7d60: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
7d70: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
7d80: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
7d90: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
7da0: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
7db0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
7dc0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
7dd0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
7de0: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
7df0: 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  "..**.** When p-
7e00: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63  >explain==1, eac
7e10: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
7e20: 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a   listed.  When.*
7e30: 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c  * p->explain==2,
7e40: 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e   only OP_Explain
7e50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
7e60: 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65  e listed and the
7e70: 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20  se.** are shown 
7e80: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66  in a different f
7e90: 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61  ormat.  p->expla
7ea0: 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f  in==2 is used to
7eb0: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58   implement.** EX
7ec0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
7ed0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
7ee0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73  explain==1, firs
7ef0: 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  t the main progr
7f00: 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68  am is listed, th
7f10: 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68  en each of.** th
7f20: 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  e trigger subpro
7f30: 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64  grams are listed
7f40: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a   one by one..*/.
7f50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
7f60: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
7f90: 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20  ){.  int nRow;  
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
7fc0: 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74  p when row count
7fd0: 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f   reaches this */
7fe0: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b  .  int nSub = 0;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8010: 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73  r of sub-vdbes s
8020: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
8030: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
8040: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
8050: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
8060: 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20   sub-vdbes */.  
8070: 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20  Mem *pSub = 0;  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
80a0: 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f  ell hold array o
80b0: 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20  f subprogs */.  
80c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
80d0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
80e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
80f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8100: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8130: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
8140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8150: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
8160: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
8170: 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  de */.  Mem *pMe
8180: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
8190: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
81a0: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
81b0: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
81c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
81d0: 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72  plain );.  asser
81e0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
81f0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20  E_MAGIC_RUN );. 
8200: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
8210: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
8220: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
8230: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
8240: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20  _NOMEM );..  /* 
8250: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
8260: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
8270: 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72   use dynamic str
8280: 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ings for.  ** th
8290: 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74  e result, result
82a0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63   columns may bec
82b0: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
82c0: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
82d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
82e0: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
82f0: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
8300: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
8310: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  ding..  */.  rel
8320: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65  easeMemArray(pMe
8330: 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d  m, 8);..  if( p-
8340: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
8350: 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  M ){.    /* This
8360: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61   happens if a ma
8370: 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20  lloc() inside a 
8380: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8390: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72  column_text() or
83a0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
83b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20  column_text16() 
83c0: 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20  failed.  */.    
83d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
83e0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
83f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8400: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
8410: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
8420: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
8430: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
8440: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
8450: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
8460: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
8470: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
8480: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
8490: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
84a0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
84b0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
84c0: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
84d0: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
84e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
84f0: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
8500: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8510: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
8520: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
8530: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
8540: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
8550: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
8560: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
8570: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
8580: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
8590: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
85a0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
85b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
85c0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
85d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
85e0: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
85f0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
8600: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
8610: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
8620: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
8630: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
8640: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
8650: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
8660: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
8670: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
8680: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
8690: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
86a0: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
86b0: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
86c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
86d0: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
86e0: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
86f0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
8700: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
8710: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
8720: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
8730: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
8740: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
8750: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
8760: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
8770: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
8780: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
8790: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
87a0: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
87b0: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
87c0: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
87d0: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
87e0: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
87f0: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
8800: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
8810: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
8820: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
8830: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
8840: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
8850: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
8860: 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c  <nRow && p->expl
8870: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
8880: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
8890: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
88a0: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70  i>=nRow ){.    p
88b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
88c0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
88d0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
88e0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
88f0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
8900: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
8910: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
8920: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
8930: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
8940: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
8950: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
8960: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
8970: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
8980: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70   char *z;.    Op
8990: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
89a0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
89b0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
89c0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
89d0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
89e0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
89f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
8a00: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
8a10: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
8a20: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
8a30: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
8a40: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
8a50: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
8a60: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
8a70: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
8a80: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
8a90: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
8aa0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
8ab0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
8ac0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
8ad0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
8ae0: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
8af0: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
8b00: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
8b10: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
8b20: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
8b30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
8b40: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
8b50: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
8b60: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
8b70: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8b80: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
8b90: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
8ba0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
8bd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
8be0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
8bf0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8c00: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
8c10: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
8c20: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
8c30: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
8c40: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
8c50: 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ;  /* Opcode */.
8c60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
8c70: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
8c80: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
8c90: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
8ca0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
8cb0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8cc0: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
8cd0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
8ce0: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
8cf0: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
8d00: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
8d10: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
8d20: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
8d30: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
8d40: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
8d50: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
8d60: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
8d70: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
8d80: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
8d90: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
8da0: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
8db0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
8dc0: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
8dd0: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
8de0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
8df0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
8e00: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
8e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
8e20: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
8e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8e40: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
8e50: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
8e60: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
8e70: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
8e80: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
8e90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
8ea0: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
8eb0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
8ec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8ed0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
8ee0: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
8ef0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
8f00: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
8f10: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 1) ){.        
8f20: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
8f30: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
8f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
8f50: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
8f60: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
8f70: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
8f80: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
8f90: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
8fa0: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
8fb0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
8fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8fd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
8fe0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
8ff0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
9000: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
9030: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9040: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9050: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9060: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9070: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
9080: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
90b0: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
90c0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
90d0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
90e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
90f0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
9100: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
9110: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9130: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P3 */.    pMem->
9140: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9150: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9160: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
9170: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9180: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
9190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
91a0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
91b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
91c0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
91d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
91e0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
91f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
9200: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
9210: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
9220: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
9230: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
9240: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
9250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9260: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
9270: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
9280: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
9290: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
92a0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
92b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
92c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
92d0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
92e0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
92f0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
9300: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9310: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9320: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
9330: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
9340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9350: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9360: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
9370: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9380: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9390: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
93a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
93b0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
93c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
93d0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
93e0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
93f0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
9400: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9410: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
9420: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
9430: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
9440: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9450: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9460: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9470: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9480: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
9490: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
94a0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a        if( pOp->z
94b0: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
94c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
94d0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
94e0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
94f0: 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  >z = pOp->zComme
9500: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
9510: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
9520: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
9530: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
9540: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9550: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
9560: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9570: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  T;.      }else.#
9580: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
9590: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
95a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
95d0: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
95e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
95f0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
9600: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
9610: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
9620: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
9630: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9640: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
9650: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
9660: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
9670: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9680: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
9690: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
96a0: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
96b0: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
96c0: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
96d0: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
96e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
96f0: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
9700: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9710: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
9720: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
9730: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
9740: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
9750: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
9760: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
9770: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
9780: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9790: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
97a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
97b0: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
97c0: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
97d0: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
97e0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
97f0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9810: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
9820: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
9830: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
9840: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
9850: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
9860: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
9870: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
9880: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
9890: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
98a0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
98b0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
98c0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
98d0: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
98e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
98f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
9900: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
9910: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
9920: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
9930: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
9940: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
9950: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9960: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
9970: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
9980: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9990: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
99a0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
99b0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
99c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
99d0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
99e0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
99f0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
9a00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
9a10: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
9a20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9a30: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
9a40: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
9a50: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
9a60: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
9a70: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
9a80: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
9a90: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
9aa0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
9ab0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9ac0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
9ad0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
9ae0: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
9af0: 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e  uffer and return
9b00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
9b10: 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66   that space.  If
9b20: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
9b30: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
9b40: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
9b50: 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61  *.** The pBuf pa
9b60: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69  rameter is the i
9b70: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
9b80: 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  a pointer which 
9b90: 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20  will.** receive 
9ba0: 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  the new memory. 
9bb0: 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c   pBuf is normall
9bc0: 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66  y NULL.  If pBuf
9bd0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
9be0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d   it means that m
9bf0: 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20  emory space has 
9c00: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
9c10: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a  ocated and that.
9c20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9c30: 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63  should not alloc
9c40: 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f  ate any new memo
9c50: 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69  ry.  When pBuf i
9c60: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69  s not.** NULL si
9c70: 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66  mply return pBuf
9c80: 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65  .  Only allocate
9c90: 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63   new memory spac
9ca0: 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69  e when pBuf.** i
9cb0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42  s NULL..**.** nB
9cc0: 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  yte is the numbe
9cd0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
9ce0: 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  ace needed..**.*
9cf0: 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73  * *ppFrom points
9d00: 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70   to available sp
9d10: 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69  ace and pEnd poi
9d20: 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  nts to the end o
9d30: 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62  f the.** availab
9d40: 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20  le space.  When 
9d50: 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  space is allocat
9d60: 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61  ed, *ppFrom is a
9d70: 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20  dvanced past.** 
9d80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
9d90: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
9da0: 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73  **.** *pnByte is
9db0: 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68   a counter of th
9dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9dd0: 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20  s of space that 
9de0: 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74  have failed.** t
9df0: 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20  o allocate.  If 
9e00: 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69  there is insuffi
9e10: 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a  cient space in *
9e20: 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66  ppFrom to satisf
9e30: 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  y the.** request
9e40: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
9e50: 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20   *pnByte by the 
9e60: 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65  amount of the re
9e70: 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  quest..*/.static
9e80: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
9e90: 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  e(.  void *pBuf,
9ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
9eb0: 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  re return pointe
9ec0: 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  r will be stored
9ed0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
9ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ef0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
9f00: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
9f10: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
9f20: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
9f30: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
9f40: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
9f50: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
9f60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
9f70: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
9f80: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
9f90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
9fa0: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
9fb0: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
9fc0: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
9fd0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
9fe0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9ff0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
a000: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
a010: 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65  .  if( pBuf ) re
a020: 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79  turn pBuf;.  nBy
a030: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
a040: 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46  e);.  if( &(*ppF
a050: 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70  rom)[nByte] <= p
a060: 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20  End ){.    pBuf 
a070: 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d  = (void*)*ppFrom
a080: 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d  ;.    *ppFrom +=
a090: 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b   nByte;.  }else{
a0a0: 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20  .    *pnByte += 
a0b0: 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
a0c0: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
a0d0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
a0e0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
a0f0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69   execution.  Thi
a100: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
a110: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
a120: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
a130: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
a140: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
a150: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
a160: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
a170: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
a180: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
a190: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
a1a0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a1b0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
a1c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
a1d0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
a1e0: 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44  e a VDBE from VD
a1f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f  BE_MAGIC_INIT to
a200: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  .** VDBE_MAGIC_R
a210: 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  UN..**.** This f
a220: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
a230: 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  alled more than 
a240: 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65  once on a single
a250: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a260: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  ..** The first c
a270: 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69 6c  all is made whil
a280: 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  e compiling the 
a290: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 53  SQL statement. S
a2a0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c  ubsequent.** cal
a2b0: 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73 20 70  ls are made as p
a2c0: 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  art of the proce
a2d0: 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67 20  ss of resetting 
a2e0: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62  a statement to b
a2f0: 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65 64  e.** re-executed
a300: 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f   (from a call to
a310: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
a320: 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65  ). The nVar, nMe
a330: 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61  m, nCursor .** a
a340: 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61 72  nd isExplain par
a350: 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c 79  ameters are only
a360: 20 70 61 73 73 65 64 20 63 6f 72 72 65 63 74 20   passed correct 
a370: 76 61 6c 75 65 73 20 74 68 65 20 66 69 72 73 74  values the first
a380: 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e   time.** the fun
a390: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a3a0: 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63   On subsequent c
a3b0: 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74  alls, from sqlit
a3c0: 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61 72  e3_reset(), nVar
a3d0: 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d 31  .** is passed -1
a3e0: 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73   and nMem, nCurs
a3f0: 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e  or and isExplain
a400: 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64 20   are all passed 
a410: 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  zero..*/.void sq
a420: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
a430: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
a460: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a490: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
a4a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
a4b0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a4e0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
a4f0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
a500: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a520: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
a530: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
a540: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
a570: 62 65 72 20 6f 66 20 61 72 67 73 20 69 6e 20 53  ber of args in S
a580: 75 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubPrograms */.  
a590: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 2c 20 20  int isExplain,  
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5b0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
a5c0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
a5d0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
a5e0: 6e 74 20 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  nt usesStmtJourn
a5f0: 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  al            /*
a600: 20 54 72 75 65 20 74 6f 20 73 65 74 20 56 64 62   True to set Vdb
a610: 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  e.usesStmtJourna
a620: 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  l */.){.  int n;
a630: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a640: 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72   p->db;..  asser
a650: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
a660: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
a670: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
a680: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
a690: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
a6a0: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
a6b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
a6c0: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
a6d0: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
a6e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
a6f0: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
a700: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
a710: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
a720: 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f  IC_RUN;..  /* Fo
a730: 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65  r each cursor re
a740: 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c  quired, also all
a750: 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63  ocate a memory c
a760: 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a  ell. Memory.  **
a770: 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e   cells (nMem+1-n
a780: 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69  Cursor)..nMem, i
a790: 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e  nclusive, will n
a7a0: 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a  ever be used by.
a7b0: 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72    ** the vdbe pr
a7c0: 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74  ogram. Instead t
a7d0: 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  hey are used to 
a7e0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
a7f0: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
a800: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
a810: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
a820: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
a830: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
a840: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
a850: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
a860: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
a870: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
a880: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
a890: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
a8a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
a8b0: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
a8c0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
a8d0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
a8e0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
a8f0: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
a900: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
a910: 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  or memory regist
a920: 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c  ers, SQL variabl
a930: 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73  es, VDBE cursors
a940: 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72   and .  ** an ar
a950: 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53  ray to marshal S
a960: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
a970: 6d 65 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69  ments in. This i
a980: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a  s only done the.
a990: 20 20 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20    ** first time 
a9a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
a9b0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69   called for a gi
a9c0: 76 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68  ven VDBE, not wh
a9d0: 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65  en it is.  ** be
a9e0: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
a9f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20  sqlite3_reset() 
aa00: 74 6f 20 72 65 73 65 74 20 74 68 65 20 76 69 72  to reset the vir
aa10: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20  tual machine..  
aa20: 2a 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30  */.  if( nVar>=0
aa30: 20 26 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d   && ALWAYS(db->m
aa40: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20  allocFailed==0) 
aa50: 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20  ){.    u8 *zCsr 
aa60: 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b  = (u8 *)&p->aOp[
aa70: 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f  p->nOp];       /
aa80: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
aa90: 6c 65 20 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e  le for alloation
aaa0: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64   */.    u8 *zEnd
aab0: 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70   = (u8 *)&p->aOp
aac0: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  [p->nOpAlloc];  
aad0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
aae0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d  st available mem
aaf0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
ab00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72  /* How much extr
ab30: 61 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  a memory needed 
ab40: 2a 2f 0a 0a 20 20 20 20 72 65 73 6f 6c 76 65 50  */..    resolveP
ab50: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
ab60: 29 3b 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74  );.    p->usesSt
ab70: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
ab80: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b  usesStmtJournal;
ab90: 0a 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61  .    if( isExpla
aba0: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
abb0: 0a 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  .      nMem = 10
abc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
abd0: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
abe0: 2d 7a 43 73 72 29 3b 0a 20 20 20 20 7a 43 73 72  -zCsr);.    zCsr
abf0: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
ac00: 29 30 29 26 37 3b 0a 20 20 20 20 61 73 73 65 72  )0)&7;.    asser
ac10: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
ac20: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
ac30: 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  ..    /* Memory 
ac40: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
ac50: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
ac60: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
ac70: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 20 20  ated in two.    
ac80: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
ac90: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
aca0: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
acb0: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
acc0: 68 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  he .    ** end o
acd0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
ace0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
acf0: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
ad00: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20   all memory.    
ad10: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
ad20: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
ad30: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
ad40: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
ad50: 64 0a 20 20 20 20 2a 2a 20 70 61 73 73 20 77 69  d.    ** pass wi
ad60: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
ad70: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
ad80: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
ad90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
ada0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
adb0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
adc0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
add0: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
ade0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  .    ** the left
adf0: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
ae00: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
ae10: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
ae20: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 20 20  gnificantly.    
ae30: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
ae40: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
ae50: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
ae60: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  d statement..   
ae70: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
ae80: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
ae90: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
aea0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
aeb0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
aec0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
aed0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
aee0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
aef0: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
af00: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
af10: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
af20: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  yte);.      p->a
af30: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
af40: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
af50: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
af60: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
af70: 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a  te);.      p->az
af80: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
af90: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
afa0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
afb0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
afc0: 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  te);.      p->ap
afd0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
afe0: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
aff0: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
b000: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c      &zCsr, zEnd,
b030: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
b040: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
b050: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
b060: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
b070: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
b080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
b090: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
b0a0: 20 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73       zEnd = &zCs
b0b0: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77  r[nByte];.    }w
b0c0: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21  hile( nByte && !
b0d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b0e0: 20 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72   );..    p->nCur
b0f0: 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73  sor = (u16)nCurs
b100: 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  or;.    if( p->a
b110: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Var ){.      p->
b120: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
b130: 61 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  ar;.      for(n=
b140: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
b150: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
b160: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
b170: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
b180: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
b190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b1a0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20      if( p->aMem 
b1b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
b1c0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
b1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
b1e0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
b1f0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d  nMem */.      p-
b200: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b220: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
b230: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
b240: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
b250: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
b260: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
b270: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b280: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
b290: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
b2a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
b2b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b2c0: 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70  G.  for(n=1; n<p
b2d0: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
b2e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
b2f0: 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20  m[n].db==db );. 
b300: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e   }.#endif..  p->
b310: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
b320: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b330: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
b340: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
b350: 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70  explain |= isExp
b360: 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  lain;.  p->magic
b370: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
b380: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
b390: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
b3a0: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
b3b0: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
b3c0: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
b3d0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
b3e0: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
b3f0: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
b400: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
b410: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
b420: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
b430: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
b440: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
b450: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
b460: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
b470: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
b480: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
b490: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
b4a0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
b4b0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
b4c0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
b4d0: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
b4e0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b4f0: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
b500: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
b510: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
b520: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b530: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
b540: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
b550: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
b560: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
b570: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
b580: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
b590: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
b5a0: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
b5b0: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
b5c0: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
b5d0: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
b5e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
b5f0: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
b600: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
b610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b620: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
b630: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
b640: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
b650: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
b660: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
b670: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
b680: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
b690: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
b6a0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
b6b0: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
b6c0: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
b6d0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
b6e0: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
b6f0: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
b700: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
b710: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
b720: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
b730: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
b740: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
b750: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
b760: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
b770: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
b780: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
b790: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
b7a0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
b7b0: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
b7c0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
b7d0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
b7e0: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
b7f0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
b800: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
b810: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
b820: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
b830: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
b840: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
b850: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
b860: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
b870: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
b880: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
b890: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
b8a0: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
b8b0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
b8c0: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
b8d0: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
b8e0: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
b8f0: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  >nChange;.  retu
b900: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
b910: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
b920: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
b930: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
b940: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
b950: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
b960: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
b970: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
b980: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
b990: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
b9a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
b9b0: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
b9c0: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
b9d0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
b9e0: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
b9f0: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
ba00: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
ba10: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
ba20: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
ba30: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
ba40: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
ba50: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
ba60: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
ba70: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
ba80: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
ba90: 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
baa0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
bab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
bac0: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
bad0: 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72  e);.  }.  p->pFr
bae0: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ame = 0;.  p->nF
baf0: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rame = 0;..  if(
bb00: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
bb10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
bb20: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
bb30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
bb40: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
bb50: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
bb60: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
bb70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bb80: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
bb90: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
bba0: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
bbb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bbc0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
bbd0: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
bbe0: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
bbf0: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
bc00: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
bc10: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
bc20: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
bc30: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
bc40: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
bc50: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
bc60: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
bc70: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
bc80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
bc90: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
bca0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
bcb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bcc0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
bcd0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
bce0: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
bcf0: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
bd00: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
bd10: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
bd20: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
bd30: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
bd40: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
bd50: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
bd60: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
bd70: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
bd80: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
bd90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
bda0: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
bdb0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
bdc0: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
bdd0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
bde0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
bdf0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
be00: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
be10: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
be20: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  /.  int i;.  for
be30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
be40: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
be50: 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20   p->apCsr==0 || 
be60: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
be70: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
be80: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
be90: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30  sert( p->aMem==0
bea0: 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66   || p->aMem[i].f
beb0: 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29  lags==MEM_Null )
bec0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
bed0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
bee0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
bef0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
bf00: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
bf10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
bf20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
bf30: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
bf40: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
bf50: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
bf60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
bf70: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
bf80: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
bf90: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
bfa0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
bfb0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
bfc0: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
bfd0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
bfe0: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
bff0: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
c000: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
c010: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
c020: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
c030: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
c040: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
c050: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
c060: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
c070: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c080: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
c090: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
c0a0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
c0b0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
c0c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c0d0: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
c0e0: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
c0f0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
c100: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
c110: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
c120: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
c130: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
c140: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
c150: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
c160: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
c170: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
c180: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
c190: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
c1a0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
c1b0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
c1c0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
c1d0: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
c1e0: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
c1f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
c200: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
c210: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
c220: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
c230: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
c240: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
c250: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
c260: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
c280: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
c290: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
c2a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
c2b0: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
c2c0: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
c2d0: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
c2e0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
c2f0: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
c300: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
c310: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
c320: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
c330: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
c340: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
c350: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
c360: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
c370: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
c380: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
c390: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
c3a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
c3b0: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
c3c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
c3e0: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
c3f0: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
c400: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c420: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
c430: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
c440: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
c470: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
c480: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
c490: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4b0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
c4c0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
c4d0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
c4e0: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c500: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
c510: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
c520: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
c530: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
c540: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
c550: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
c560: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
c570: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
c580: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
c590: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
c5a0: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
c5b0: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
c5c0: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
c5d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c5e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c5f0: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
c600: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
c610: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
c620: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
c630: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
c640: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
c650: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
c660: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
c670: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
c680: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
c690: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
c6a0: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
c6b0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
c6c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
c6d0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
c6e0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
c6f0: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
c700: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
c710: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
c720: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
c730: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
c740: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
c750: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
c760: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
c770: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
c780: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
c790: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
c7a0: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
c7b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
c7c0: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
c7d0: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
c7e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
c7f0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
c800: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
c810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
c820: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
c830: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
c840: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
c850: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c860: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
c870: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
c880: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c890: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
c8a0: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
c8b0: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
c8c0: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
c8d0: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
c8e0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
c8f0: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
c900: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
c910: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
c920: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
c930: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
c940: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
c950: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
c960: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
c970: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
c980: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
c990: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
c9a0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
c9b0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
c9c0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
c9d0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
c9e0: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
c9f0: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
ca00: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
ca10: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
ca20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
ca30: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
ca40: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
ca50: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
ca60: 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72  ync(db, &p->zErr
ca70: 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Msg);..  /* This
ca80: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
ca90: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
caa0: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
cab0: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
cac0: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
cad0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
cae0: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
caf0: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
cb00: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
cb10: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
cb20: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
cb30: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
cb40: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
cb50: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cb60: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
cb70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
cb80: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cb90: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
cba0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
cbb0: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
cbc0: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
cbd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cbe0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
cbf0: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
cc00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
cc10: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
cc20: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
cc30: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
cc40: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
cc50: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
cc60: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
cc70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
cc80: 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
cc90: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
cca0: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20  r(pBt));.    }. 
ccb0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
ccc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
ccd0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cce0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
ccf0: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
cd00: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
cd10: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
cd20: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
cd30: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
cd40: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
cd50: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
cd60: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
cd70: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
cd80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
cd90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
cda0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
cdb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cdc0: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
cdd0: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
cde0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cdf0: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
ce00: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
ce10: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
ce20: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
ce30: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
ce40: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
ce50: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
ce60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
ce70: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
ce80: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
ce90: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
cea0: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
ceb0: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
cec0: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
ced0: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
cee0: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
cef0: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
cf00: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
cf10: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
cf20: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
cf30: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
cf40: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
cf50: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
cf60: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
cf70: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
cf80: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
cf90: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
cfa0: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
cfb0: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
cfc0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
cfd0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
cfe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
cff0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d000: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d010: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
d020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d030: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d040: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
d050: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
d060: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
d070: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
d080: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
d090: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
d0a0: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
d0b0: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
d0c0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
d0d0: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
d0e0: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
d0f0: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
d100: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
d110: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
d120: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
d130: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
d140: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
d150: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
d160: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
d170: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
d180: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
d190: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
d1a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d1b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
d1c0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
d1d0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
d1e0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d200: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
d210: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
d220: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d230: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
d240: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d250: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
d260: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
d270: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
d280: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
d290: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
d2a0: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
d2b0: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
d2c0: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
d2d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d2e0: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
d2f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d300: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
d310: 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a   atomicly..  */.
d320: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d330: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
d340: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
d350: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
d360: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
d370: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
d380: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
d390: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
d3a0: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
d3b0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
d3c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
d3d0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
d3e0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
d3f0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
d400: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
d410: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
d420: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
d430: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
d440: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
d450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d460: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
d470: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
d480: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73  iRandom;.      s
d490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d4a0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d4b0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
d4c0: 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
d4d0: 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
d4e0: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
d4f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
d500: 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  b, "%s-mj%08X", 
d510: 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64  zMainFile, iRand
d520: 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a  om&0x7fffffff);.
d530: 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
d540: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  er ){.        re
d550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d560: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
d570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
d580: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
d590: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
d5a0: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
d5b0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
d5c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
d5d0: 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
d5e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d5f0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
d600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
d610: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
d620: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
d630: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
d640: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
d650: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
d660: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
d670: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
d680: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
d690: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
d6a0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
d6b0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
d6c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
d6d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d6e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
d6f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
d700: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
d710: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d720: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
d730: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
d740: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
d750: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d760: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
d770: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
d780: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
d790: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
d7a0: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
d7b0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
d7c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d7d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
d7e0: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
d7f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
d800: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
d810: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
d820: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
d830: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
d840: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
d850: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
d860: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
d870: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
d880: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
d890: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
d8a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
d8b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
d8c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
d8d0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
d8e0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
d8f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
d900: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
d910: 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
d920: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
d930: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
d940: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
d950: 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
d960: 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
d970: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
d980: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
d990: 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
d9a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e  ;.        if( !n
d9b0: 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69  eedSync && !sqli
d9c0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
d9d0: 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20  bled(pBt) ){.   
d9e0: 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
d9f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
da00: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
da10: 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
da20: 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
da30: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
da40: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
da50: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
da60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
da70: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
da80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
da90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
daa0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
dab0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
dac0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
dad0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
dae0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
daf0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
db00: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
db10: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
db20: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
db30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
db40: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
db50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
db60: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
db70: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
db80: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
db90: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
dba0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
dbb0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
dbc0: 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d  ync .     && 0==
dbd0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
dbe0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
dbf0: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
dc00: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
dc10: 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
dc20: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
dc30: 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
dc40: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
dc50: 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
dc60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
dc70: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
dc80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
dc90: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
dca0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
dcb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dcc0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
dcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
dce0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
dcf0: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
dd00: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
dd10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
dd20: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
dd30: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
dd40: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
dd50: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
dd60: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
dd70: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
dd80: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
dd90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
dda0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ddb0: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
ddc0: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
ddd0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
dde0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
ddf0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
de00: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
de10: 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
de20: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
de30: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
de40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
de50: 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
de60: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
de70: 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
de80: 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
de90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
dea0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
deb0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
dec0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
ded0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
dee0: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
def0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
df00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
df10: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
df20: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
df30: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
df40: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
df50: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
df60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
df70: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
df80: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
df90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dfa0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
dfb0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
dfc0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
dfd0: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
dfe0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dff0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
e000: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e010: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e020: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e030: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
e040: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e050: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
e060: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
e070: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
e080: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
e090: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
e0a0: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
e0b0: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
e0c0: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
e0d0: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
e0e0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
e0f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e100: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e110: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
e120: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e130: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
e140: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
e150: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e160: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e170: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
e180: 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
e190: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
e1a0: 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
e1b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
e1c0: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
e1d0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e1e0: 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
e1f0: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
e200: 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
e210: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
e220: 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
e230: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
e240: 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
e250: 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
e260: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
e270: 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
e280: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
e290: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
e2a0: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
e2b0: 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
e2c0: 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
e2d0: 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
e2e0: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
e2f0: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
e300: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
e310: 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
e320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
e330: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
e340: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
e350: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e360: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
e370: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
e380: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
e390: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e3a0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e3b0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e3d0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e3e0: 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
e3f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e400: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e410: 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
e420: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
e430: 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
e440: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
e450: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
e460: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e470: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
e480: 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
e490: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69  the sqlite3.acti
e4a0: 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20  veVdbeCnt count 
e4b0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
e4c0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
e4d0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
e4e0: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
e4f0: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
e500: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
e510: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
e520: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
e530: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
e540: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
e550: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
e560: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
e570: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
e580: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
e590: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
e5a0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
e5b0: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
e5c0: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
e5d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
e5e0: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
e5f0: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
e600: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
e610: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
e620: 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
e630: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
e640: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
e650: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
e660: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
e670: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
e680: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
e690: 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
e6a0: 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
e6b0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
e6c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
e6d0: 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61  sert( cnt==db->a
e6e0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a  ctiveVdbeCnt );.
e6f0: 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
e700: 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  ==db->writeVdbeC
e710: 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  nt );.}.#else.#d
e720: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
e730: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
e740: 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76  if../*.** For ev
e750: 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69  ery Btree that i
e760: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
e770: 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a  ction db which .
e780: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
e790: 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20  fied, "trip" or 
e7a0: 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20  invalidate each 
e7b0: 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61  cursor in.** tha
e7c0: 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61  t Btree might ha
e7d0: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
e7e0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72   so that the cur
e7f0: 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72  sor.** can never
e800: 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20   be used again. 
e810: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
e820: 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  en a rollback.**
e830: 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61  * occurs.  We ha
e840: 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74  ve to trip all t
e850: 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  he other cursors
e860: 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  , even.** cursor
e870: 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20   from other VMs 
e880: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74  in different dat
e890: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e8a0: 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f  s,.** so that no
e8b0: 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74  ne of them try t
e8c0: 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61  o use the data a
e8d0: 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  t which they.** 
e8e0: 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e  were pointing an
e8f0: 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20  d which now may 
e900: 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65  have been change
e910: 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20  d due.** to the 
e920: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
e930: 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20  Remember that a 
e940: 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c  rollback can del
e950: 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c  ete tables compl
e960: 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64  ete and.** reord
e970: 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53  er rootpages.  S
e980: 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
e990: 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73  icient just to s
e9a0: 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  ave.** the state
e9b0: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
e9c0: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61   We have to inva
e9d0: 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f  lidate the curso
e9e0: 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  r.** so that it 
e9f0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67  is never used ag
ea00: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
ea10: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75  oid invalidateCu
ea20: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
ea30: 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64  trees(sqlite3 *d
ea40: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  b){.  int i;.  f
ea50: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
ea60: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
ea70: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
ea80: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
ea90: 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  p && sqlite3Btre
eaa0: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
eab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
eac0: 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
ead0: 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  s(p, SQLITE_ABOR
eae0: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
eaf0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
eb00: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
eb10: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
eb20: 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
eb30: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
eb40: 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
eb50: 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
eb60: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
eb70: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
eb80: 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
eb90: 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
eba0: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
ebb0: 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
ebc0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
ebd0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
ebe0: 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
ebf0: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
ec00: 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
ec10: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
ec20: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74  saction is commt
ec30: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
ec40: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
ec50: 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
ec60: 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
ec70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
ec80: 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
ec90: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
eca0: 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
ecb0: 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
ecc0: 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
ecd0: 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
ece0: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
ecf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
ed00: 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
ed10: 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
ed20: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
ed30: 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
ed40: 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
ed50: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
ed60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
ed70: 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
ed80: 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
ed90: 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
eda0: 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
edb0: 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67  occured, causing
edc0: 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
edd0: 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
ede0: 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
edf0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
ee00: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
ee10: 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
ee20: 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
ee30: 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
ee40: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
ee50: 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
ee60: 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
ee70: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
ee80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
ee90: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
eea0: 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
eeb0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
eec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
eed0: 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
eee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
eef0: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
ef00: 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
ef10: 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
ef20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ef30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ef40: 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
ef50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ef60: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
ef70: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ef80: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
ef90: 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
efa0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
efb0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
efc0: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
efd0: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
efe0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
eff0: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f010: 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
f020: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f030: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
f040: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
f050: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
f060: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
f070: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f080: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f0a0: 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
f0b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
f0d0: 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
f0e0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f0f0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   0;..    /* If t
f100: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
f110: 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
f120: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
f130: 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
f140: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f150: 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
f160: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
f170: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
f180: 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
f190: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
f1a0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f1b0: 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
f1c0: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f1d0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f1e0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
f1f0: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
f200: 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
f210: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f220: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f230: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f240: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
f250: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
f260: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
f270: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
f280: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
f290: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
f2a0: 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
f2b0: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
f2c0: 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
f2d0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
f2e0: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
f2f0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
f300: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
f310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f320: 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
f330: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
f340: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
f350: 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
f360: 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
f370: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
f380: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
f390: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
f3a0: 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
f3b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
f3c0: 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20  and write.** an 
f3d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
f3e0: 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
f3f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
f400: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f410: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
f420: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
f430: 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
f440: 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
f450: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f460: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
f470: 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e  eferred && db->n
f480: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20  DeferredCons>0) 
f490: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
f4a0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
f4b0: 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  t>0) ){.    p->r
f4c0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
f4d0: 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72  RAINT;.    p->er
f4e0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
f4f0: 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
f500: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
f510: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72  ErrMsg, db, "for
f520: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
f530: 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
f540: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f550: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
f560: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f580: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f590: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
f5a0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
f5b0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
f5c0: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
f5d0: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
f5e0: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
f5f0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
f600: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
f610: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
f620: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
f630: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
f640: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f650: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
f660: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
f670: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
f680: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
f690: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
f6a0: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
f6b0: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
f6c0: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
f6d0: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
f6e0: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
f6f0: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
f700: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
f710: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
f720: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
f730: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
f740: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
f750: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
f760: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
f770: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
f780: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
f790: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
f7a0: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
f7b0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
f7c0: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
f7d0: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
f7e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
f7f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
f810: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
f820: 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
f830: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
f840: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
f850: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
f860: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
f870: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
f880: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
f890: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
f8a0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
f8b0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
f8c0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f8d0: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
f8e0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
f8f0: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
f900: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
f910: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
f920: 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
f930: 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
f940: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
f950: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
f960: 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
f970: 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
f980: 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
f990: 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
f9a0: 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
f9b0: 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
f9c0: 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
f9d0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
f9e0: 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
f9f0: 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
fa00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
fa10: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
fa20: 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
fa30: 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
fa40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
fa50: 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
fa60: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
fa70: 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
fa80: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
fa90: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
faa0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fab0: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
fac0: 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
fad0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
fae0: 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
faf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fb00: 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
fb10: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
fb20: 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
fb30: 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
fb40: 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
fb50: 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
fb60: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
fb70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
fb80: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
fb90: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
fba0: 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
fbb0: 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
fbc0: 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
fbd0: 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
fbe0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
fbf0: 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
fc00: 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
fc10: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
fc20: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
fc30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
fc40: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
fc50: 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
fc60: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
fc70: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
fc80: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
fc90: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
fca0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
fcb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
fcc0: 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
fcd0: 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
fce0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
fcf0: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
fd00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
fd10: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
fd20: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
fd30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
fd40: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
fd50: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
fd60: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
fd70: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
fd80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
fd90: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
fda0: 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
fdb0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
fdc0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
fdd0: 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
fde0: 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
fdf0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
fe00: 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
fe10: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
fe20: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
fe30: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
fe40: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
fe50: 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
fe60: 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
fe70: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
fe80: 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
fe90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
fea0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
feb0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
fec0: 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
fed0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
fee0: 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
fef0: 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
ff00: 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
ff10: 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68     ** occured wh
ff20: 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
ff30: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
ff40: 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
ff50: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
ff60: 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
ff70: 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
ff80: 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
ff90: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
ffa0: 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
ffb0: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
ffc0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
ffd0: 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
ffe0: 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
fff0: 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
10000 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
10010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
10020 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
10030 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
10040 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
10050 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
10060 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
10070 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
10080 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
10090 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
100a0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
100b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
100c0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
100d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
100e0 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
100f0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
10100 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
10110 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
10120 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
10130 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
10140 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
10150 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
10160 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
10170 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
10180 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
10190 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
101a0 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
101b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
101c0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
101d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
101e0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
101f0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
10200 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10210 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
10220 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10230 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
10240 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
10250 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
10260 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
10270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10290 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
102a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
102b0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
102c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
102d0 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
102e0 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
102f0 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
10300 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
10310 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10320 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
10330 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
10340 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10350 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
10360 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
10370 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
10380 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
10390 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
103a0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
103b0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
103c0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
103d0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
103e0 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
103f0 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  & db->writeVdbeC
10400 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  nt==(p->readOnly
10410 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
10420 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10430 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
10440 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
10450 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
10460 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
10470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10480 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
10490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
104a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
104b0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
104c0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
104d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
104e0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
104f0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
10500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
10510 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
10520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10530 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
10540 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
10550 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
10560 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
10570 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
10580 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
10590 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
105a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
105b0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
105c0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
105d0 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
105e0 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
105f0 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
10600 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
10610 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
10620 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
10630 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
10640 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
10650 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
10660 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
10670 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
10680 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10690 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
106a0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
106b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
106c0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
106d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
106e0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
106f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10710 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
10720 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
10730 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10740 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10760 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10770 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
10780 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
10790 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
107a0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
107b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
107c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
107d0 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
107e0 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
107f0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
10800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
10810 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
10820 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10830 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
10840 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
10850 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
10860 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10870 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10880 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
10890 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
108a0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
108b0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
108c0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
108d0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
108e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
108f0 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10900 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10910 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10920 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10930 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10940 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
10950 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
10960 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10970 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10980 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
10990 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
109a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
109b0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
109c0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
109d0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
109e0 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
109f0 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
10a00 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10a10 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
10a20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
10a30 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
10a40 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
10a50 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
10a60 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
10a70 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
10a80 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
10a90 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
10aa0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
10ab0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
10ac0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
10ad0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10ae0 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  te that sqlite3V
10af0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10b00 74 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69  t() can only fai
10b10 6c 20 69 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  l if eStatementO
10b20 70 0a 20 20 20 20 2a 2a 20 69 73 20 53 41 56 45  p.    ** is SAVE
10b30 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20  POINT_ROLLBACK. 
10b40 20 42 75 74 20 69 66 20 70 2d 3e 72 63 3d 3d 53   But if p->rc==S
10b50 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 65 53  QLITE_OK then eS
10b60 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a  tatementOp.    *
10b70 2a 20 6d 75 73 74 20 62 65 20 53 41 56 45 50 4f  * must be SAVEPO
10b80 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 20 48 65  INT_RELEASE.  He
10b90 6e 63 65 20 74 68 65 20 4e 45 56 45 52 28 70 2d  nce the NEVER(p-
10ba0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc==SQLITE_OK) 
10bb0 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  in .    ** the f
10bc0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 2e 0a 20  ollowing code.. 
10bd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
10be0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
10bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10c00 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10c10 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
10c20 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
10c30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  c ){.        ass
10c40 65 72 74 28 20 65 53 74 61 74 65 6d 65 6e 74 4f  ert( eStatementO
10c50 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10c60 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  LBACK );.       
10c70 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 63   if( NEVER(p->rc
10c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20  ==SQLITE_OK) || 
10c90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
10ca0 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
10cb0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10cd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10ce0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
10cf0 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
10d00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
10d10 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10d20 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10d30 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10d50 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10d70 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10d80 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
10d90 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
10db0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
10dc0 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
10dd0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
10de0 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
10df0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
10e00 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
10e10 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
10e20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
10e30 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
10e40 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
10e50 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
10e60 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
10e70 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
10e80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10e90 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
10ea0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
10eb0 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
10ec0 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
10ed0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10ee0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10ef0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
10f00 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
10f10 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
10f20 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
10f30 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
10f40 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
10f50 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
10f60 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
10f70 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
10f80 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
10f90 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
10fa0 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
10fb0 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
10fc0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d  , -1);.      db-
10fd0 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
10fe0 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
10ff0 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
11000 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
11010 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
11020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
11030 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
11040 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
11050 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
11060 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
11070 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
11080 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
11090 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
110a0 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
110b0 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
110c0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
110d0 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
110e0 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t--;.    }.    a
110f0 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76  ssert( db->activ
11100 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72  eVdbeCnt>=db->wr
11110 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20  iteVdbeCnt );.  
11120 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
11130 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
11140 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
11150 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
11160 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11170 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11180 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
111a0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
111b0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
111c0 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
111d0 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
111e0 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
111f0 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
11200 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
11210 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
11220 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
11230 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
11240 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
11250 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
11260 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
11270 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
11280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
11290 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
112a0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
112b0 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
112c0 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e  dbeCnt>0 || db->
112d0 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
112e0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
112f0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
11300 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
11310 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
11320 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
11330 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
11340 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
11350 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
11360 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
11370 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
11380 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
11390 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
113a0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
113b0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
113c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
113d0 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
113e0 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
113f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11400 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
11410 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
11420 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
11430 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
11440 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
11450 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
11460 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
11470 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
11480 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
11490 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
114a0 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
114b0 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
114c0 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
114d0 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
114e0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
114f0 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
11500 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
11510 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
11520 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
11530 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
11540 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
11550 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
11560 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
11570 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
11580 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11590 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
115a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
115b0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
115c0 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
115d0 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
115e0 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
115f0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
11600 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
11610 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
11620 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
11630 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
11640 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
11650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11660 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
11670 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
11680 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
11690 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
116a0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
116b0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
116c0 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
116d0 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
116e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
116f0 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
11700 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
11710 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
11720 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
11730 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
11740 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
11750 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
11760 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
11770 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
11780 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
11790 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
117a0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
117b0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
117c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
117d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
117e0 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
117f0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
11800 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
11810 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
11820 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
11830 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
11840 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11850 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
11860 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
11870 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11880 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
11890 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
118a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
118b0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
118c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
118d0 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
118e0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
118f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11900 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
11910 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
11920 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
11930 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
11940 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
11950 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
11960 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
11970 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
11980 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
11990 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
119a0 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
119b0 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
119c0 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
119d0 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
119e0 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
119f0 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
11a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
11a10 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
11a20 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
11a30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11a40 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
11a50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
11a60 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
11a70 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
11a80 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
11a90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
11ab0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
11ac0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
11ad0 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
11ae0 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
11af0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
11b00 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
11b10 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
11b20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
11b30 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
11b40 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
11b50 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
11b60 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
11b70 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
11b80 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
11b90 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
11ba0 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
11bb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
11bc0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
11bd0 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
11be0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
11bf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
11c00 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
11c10 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
11c20 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
11c30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11c40 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
11c50 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
11c60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
11c70 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
11c80 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
11c90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
11ca0 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
11cb0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
11cc0 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
11cd0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
11ce0 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
11cf0 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
11d00 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
11d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11d20 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
11d30 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
11d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
11d50 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
11d60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
11d70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
11d80 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
11d90 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
11da0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
11db0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
11dc0 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
11dd0 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
11de0 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
11df0 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
11e00 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
11e10 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
11e20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
11e30 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
11e40 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
11e50 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
11e60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11e70 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
11e80 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
11e90 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
11ea0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
11eb0 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
11ec0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
11ed0 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
11ee0 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
11ef0 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
11f00 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
11f10 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
11f20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11f30 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
11f40 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
11f50 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
11f60 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
11f70 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
11f80 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
11f90 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
11fa0 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
11fb0 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
11fc0 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
11fd0 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
11fe0 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
11ff0 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
12000 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
12010 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
12020 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
12030 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
12040 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
12050 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
12060 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
12070 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
12080 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
12090 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
120a0 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
120b0 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
120c0 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75  1 || !(mask&(((u
120d0 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70  32)1)<<i))) && p
120e0 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
120f0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
12100 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
12110 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
12120 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
12130 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
12140 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
12150 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
12160 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
12170 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12180 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
12190 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
121a0 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  nt..** The diffe
121b0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
121c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
121d0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
121e0 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
121f0 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
12200 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
12210 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
12220 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
12230 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
12240 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12250 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
12260 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65  e3VdbeDeleteObje
12270 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
12280 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
12290 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
122a0 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
122b0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
122c0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
122d0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
122e0 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
122f0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
12300 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
12310 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
12320 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
12330 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
12340 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
12350 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
12360 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
12370 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
12380 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
12390 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
123a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
123b0 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62  pSub);.  }.  vdb
123c0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
123d0 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
123e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
123f0 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  e(db, p->aLabel)
12400 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12410 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
12420 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
12430 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
12440 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12450 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
12460 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12470 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
12480 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
12490 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
124a0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
124b0 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
124c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
124d0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
124e0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
124f0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
12500 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
12510 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
12520 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
12530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
12540 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
12550 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
12560 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
12570 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
12580 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
12590 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
125a0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
125b0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
125c0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
125d0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
125e0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d  Object(db, p);.}
125f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
12600 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
12610 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
12620 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
12630 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
12640 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
12650 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
12660 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
12670 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
12680 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
12690 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
126a0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
126b0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
126c0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
126d0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
126e0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
126f0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
12700 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
12710 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
12720 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
12730 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
12740 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
12750 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
12760 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
12770 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
12780 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
12790 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
127a0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
127b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
127c0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
127d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
127e0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
127f0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
12800 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
12810 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
12820 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
12830 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12840 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
12850 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
12860 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
12870 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
12880 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
12890 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
128a0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
128b0 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
128c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
128d0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
128e0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
128f0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
12900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12910 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
12920 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
12930 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
12940 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
12950 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12960 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
12970 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
12980 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
12990 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
129a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
129b0 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
129c0 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
129d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
129e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
129f0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
12a00 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
12a10 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
12a20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
12a30 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
12a40 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
12a50 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
12a60 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
12a70 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
12a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
12a90 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
12aa0 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
12ab0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
12ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12ad0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
12ae0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
12af0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
12b00 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
12b10 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
12b20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12b30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12b40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
12b50 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
12b60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12b70 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
12b80 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12b90 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
12ba0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
12bb0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
12bc0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
12bd0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
12be0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
12bf0 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
12c00 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
12c10 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
12c20 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
12c30 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
12c40 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
12c50 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
12c60 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
12c70 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
12c80 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
12c90 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
12ca0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
12cb0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
12cc0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
12cd0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
12ce0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
12cf0 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
12d00 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
12d10 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
12d20 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
12d30 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
12d40 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
12d50 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
12d60 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
12d70 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
12d80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
12d90 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
12da0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
12db0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
12dc0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
12dd0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
12de0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
12df0 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
12e00 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
12e10 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
12e20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
12e30 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
12e40 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
12e50 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
12e60 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
12e70 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
12e80 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
12e90 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12eb0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
12ec0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
12ed0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12f00 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
12f30 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
12f40 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
12f60 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
12f70 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
12f80 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
12f90 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
12fa0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12fb0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
12fe0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12ff0 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
13000 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
13010 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13020 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13030 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13040 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
13050 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13060 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
13090 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
130a0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
130b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
130c0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
130d0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13100 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13110 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13140 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
13150 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
13160 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
13170 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
13180 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
13190 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
131a0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
131b0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
131c0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
131d0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
131e0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
131f0 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
13200 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
13210 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
13220 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
13230 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
13240 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
13250 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
13260 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13270 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
13280 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13290 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
132a0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
132b0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
132c0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
132d0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
132e0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
132f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13300 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
13310 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
13320 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
13330 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
13340 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
13350 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
13360 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
13370 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
13380 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
13390 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
133a0 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
133b0 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
133c0 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
133d0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b  return 8+(u32)i;
133e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
133f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
13400 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
13410 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
13420 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
13430 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
13440 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
13450 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
13460 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
13470 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
13480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13490 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
134a0 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
134b0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
134c0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
134d0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
134e0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
134f0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
13500 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
13510 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
13520 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
13530 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
13540 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
13550 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
13560 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
13570 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
13580 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
13590 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
135a0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
135b0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
135c0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
135d0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
135e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
135f0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
13600 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
13610 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
13620 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
13630 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
13640 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
13650 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
13660 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
13670 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
13680 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13690 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
136a0 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
136b0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
136c0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
136d0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
136e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
136f0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
13700 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
13710 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
13720 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
13730 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
13740 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
13750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
13760 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
13770 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
13780 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
13790 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
137a0 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
137b0 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
137c0 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
137d0 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
137e0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
137f0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
13800 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
13810 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
13820 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
13830 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
13840 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
13850 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
13860 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
13870 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
13880 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
13890 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
138a0 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
138b0 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
138c0 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
138d0 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
138e0 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
138f0 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
13900 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
13910 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
13920 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
13930 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
13940 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
13950 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
13960 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
13970 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
13980 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
13990 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
139a0 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
139b0 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
139c0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
139d0 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
139e0 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
139f0 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
13a00 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
13a10 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
13a20 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
13a30 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
13a40 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
13a50 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
13a60 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
13a70 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
13a80 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
13a90 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
13aa0 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
13ab0 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
13ac0 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
13ad0 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
13ae0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
13af0 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
13b00 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
13b10 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
13b20 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
13b30 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
13b40 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
13b50 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
13b60 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
13b70 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
13b80 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
13b90 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
13ba0 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
13bb0 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
13bc0 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
13bd0 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
13be0 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
13bf0 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
13c00 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
13c10 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
13c20 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
13c30 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
13c40 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
13c50 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
13c60 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
13c70 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
13c80 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
13c90 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
13ca0 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
13cb0 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
13cc0 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
13cd0 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
13ce0 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
13cf0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
13d00 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
13d10 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
13d20 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
13d30 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
13d40 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
13d50 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
13d60 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
13d70 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
13d80 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
13d90 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
13da0 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
13db0 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
13dc0 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
13dd0 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
13de0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
13df0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
13e00 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
13e10 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
13e20 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
13e30 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
13e40 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
13e50 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
13e60 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
13e70 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
13e80 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
13e90 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
13ea0 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
13eb0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
13ec0 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
13ed0 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
13ee0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
13ef0 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
13f00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
13f10 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
13f20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
13f30 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13f40 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
13f50 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
13f60 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
13f70 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
13f80 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
13f90 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
13fa0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
13fb0 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
13fc0 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
13fd0 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
13fe0 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
13ff0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
14000 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
14010 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
14020 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
14030 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
14040 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
14050 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
14060 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
14070 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
14080 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
14090 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
140a0 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
140b0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
140c0 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
140d0 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
140e0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
140f0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
14100 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
14110 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
14120 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
14130 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
14140 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
14150 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
14160 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
14170 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
14180 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
14190 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
141a0 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
141b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
141c0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
141d0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
141e0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
141f0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
14200 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
14210 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
14220 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
14230 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
14240 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
14250 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
14260 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
14270 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
14280 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
14290 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
142a0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
142b0 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
142c0 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
142d0 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
142e0 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
142f0 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
14300 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
14310 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
14320 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
14330 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
14340 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
14350 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
14360 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
14370 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14380 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
14390 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
143a0 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
143b0 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
143c0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
143d0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
143e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
143f0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
14400 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
14410 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
14420 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
14430 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
14440 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33  assert( len<=(u3
14450 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  2)nBuf );.    wh
14460 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
14470 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28    buf[i] = (u8)(
14480 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
14490 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
144a0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
144b0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
144c0 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
144d0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
144e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
144f0 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
14500 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14510 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
14520 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
14530 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
14540 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14550 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
14560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
14570 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  em->n<=nBuf );. 
14580 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
14590 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
145a0 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
145b0 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
145c0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
145d0 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  ){.      len += 
145e0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
145f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75       assert( nBu
14600 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f>=0 );.      if
14610 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75  ( len > (u32)nBu
14620 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  f ){.        len
14630 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20   = (u32)nBuf;.  
14640 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
14650 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
14660 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
14670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
14680 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
14690 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
146a0 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
146b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
146c0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
146d0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
146e0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
146f0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
14700 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
14710 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
14720 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
14730 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14740 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
14750 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14760 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
14770 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14780 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
14790 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
147a0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
147b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147d0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
147e0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
147f0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14810 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
14820 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
14830 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
14840 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
14850 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
14860 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
14870 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
14880 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
14890 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
148a0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
148b0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
148c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
148d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
148e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
148f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
14900 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
14910 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
14920 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14930 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
14940 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
14950 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14960 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14970 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
14980 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
14990 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
149a0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
149b0 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
149c0 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
149d0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
149e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
149f0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14a00 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
14a10 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
14a20 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14a30 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14a40 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
14a50 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14a60 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
14a70 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
14a80 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14a90 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
14aa0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
14ab0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
14ac0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
14ad0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
14ae0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
14af0 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
14b00 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
14b10 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
14b20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14b30 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14b40 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
14b50 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
14b60 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
14b70 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14b80 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
14b90 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
14ba0 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
14bb0 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
14bc0 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
14bd0 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
14be0 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
14bf0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
14c00 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
14c10 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
14c20 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
14c30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14c40 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14c50 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
14c60 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
14c70 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14c80 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
14c90 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
14ca0 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
14cb0 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
14cc0 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
14cd0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
14ce0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14cf0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14d00 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
14d10 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
14d20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
14d30 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
14d40 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
14d50 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
14d60 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
14d70 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
14d80 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
14d90 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
14da0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
14db0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
14dc0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
14dd0 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
14de0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
14e00 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
14e10 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
14e20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
14e30 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
14e40 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
14e50 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
14e60 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
14e70 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
14e80 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
14e90 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
14ea0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
14eb0 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
14ec0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
14ed0 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
14ee0 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
14ef0 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
14f00 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
14f10 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
14f20 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
14f30 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
14f40 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
14f50 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
14f60 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
14f70 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
14f80 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
14f90 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
14fa0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
14fb0 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
14fc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14fd0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
14fe0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
14ff0 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
15000 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
15010 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
15020 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
15030 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
15040 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15050 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
15060 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
15070 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
15080 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
15090 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
150a0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
150b0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
150c0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
150d0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
150e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
150f0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
15100 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15110 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15120 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15130 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
15140 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e   {.      u32 len
15150 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
15160 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
15170 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
15180 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
15190 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
151a0 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
151b0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
151c0 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
151d0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
151e0 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
151f0 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
15200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
15210 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
15220 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
15230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15240 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
15250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15260 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  .}.../*.** Given
15270 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
15280 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
15290 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
152a0 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f  arse the.** reco
152b0 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b  rd into a Unpack
152c0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
152d0 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  re.  Return a po
152e0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
152f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
15300 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
15310 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f  nction might pro
15320 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74  vide szSpace byt
15330 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
15340 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e  space at pSpace.
15350 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e    This space can
15360 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   be used to hold
15370 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
15380 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72   VDbeParsedRecor
15390 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69  d structure if i
153a0 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
153b0 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20  h.  If it is.** 
153c0 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20  not big enough, 
153d0 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65  space is obtaine
153e0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
153f0 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  alloc()..**.** T
15400 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75  he returned stru
15410 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20  cture should be 
15420 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c  closed by a call
15430 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   to.** sqlite3Vd
15440 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
15450 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e  Record()..*/ .Un
15460 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
15470 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
15480 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
15490 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
154a0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
154b0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
154c0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
154d0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
154e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
154f0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
15500 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
15510 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
15520 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
15530 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
15540 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce,          /* 
15550 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
15560 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c  available to hol
15570 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  d the object */.
15580 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20    int szSpace   
15590 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
155a0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
155b0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  bytes */.){.  co
155c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
155d0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
155e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
155f0 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65  )pKey;.  Unpacke
15600 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20  dRecord *p;  /* 
15610 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  The unpacked rec
15620 6f 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c  ord that we will
15630 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15640 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
15650 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
15660 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
15670 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  p, in bytes */. 
15680 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64   int d;.  u32 id
15690 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  x;.  u16 u;     
156a0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
156b0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
156c0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
156d0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
156e0 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
156f0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65       /* Increase
15700 20 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20   pSpace by this 
15710 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61  much to 8-byte a
15720 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20  lign it */.  .  
15730 2f 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20  /*.  ** We want 
15740 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
15750 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
15760 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
15770 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
15780 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
15790 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
157a0 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
157b0 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
157c0 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
157d0 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
157e0 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
157f0 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
15800 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
15810 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
15820 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
15830 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
15840 37 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63  7)) & 7;.  pSpac
15850 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53  e += nOff;.  szS
15860 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20  pace -= nOff;.  
15870 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
15880 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
15890 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
158a0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
158b0 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
158c0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29   nByte>szSpace )
158d0 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
158e0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
158f0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
15900 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
15910 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
15920 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
15930 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20  KED_NEED_FREE | 
15940 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
15950 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  STROY;.  }else{.
15960 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
15970 64 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b  dRecord*)pSpace;
15980 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
15990 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45  UNPACKED_NEED_DE
159a0 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e  STROY;.  }.  p->
159b0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
159c0 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
159d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
159e0 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d  eld + 1;.  p->aM
159f0 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d  em = pMem = (Mem
15a00 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
15a10 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
15a20 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
15a30 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
15a40 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
15a50 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
15a60 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
15a70 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
15a80 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
15a90 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
15aa0 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
15ab0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
15ac0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
15ad0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
15ae0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
15af0 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
15b00 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
15b10 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
15b20 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
15b30 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
15b40 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
15b50 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  s = 0;.    pMem-
15b60 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
15b70 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
15b80 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
15b90 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
15ba0 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
15bb0 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
15bc0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a  Mem++;.    u++;.
15bd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
15be0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
15bf0 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
15c00 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75  ield = u;.  retu
15c10 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a  rn (void*)p;.}..
15c20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15c30 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e  ne destroys a Un
15c40 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a  packedRecord obj
15c50 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
15c60 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
15c70 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70  packedRecord(Unp
15c80 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
15c90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
15ca0 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  *pMem;..  assert
15cb0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
15cc0 72 74 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55  rt( p->flags & U
15cd0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
15ce0 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d  TROY );.  for(i=
15cf0 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b  0, pMem=p->aMem;
15d00 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b   i<p->nField; i+
15d10 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  +, pMem++){.    
15d20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20  /* The unpacked 
15d30 72 65 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73  record is always
15d40 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
15d50 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  the.    ** sqlit
15d60 65 33 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f  e3VdbeUnpackReco
15d70 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62  rd() function ab
15d80 6f 76 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73  ove, which makes
15d90 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69   all.    ** stri
15da0 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74  ngs and blobs st
15db0 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20  atic.  And none 
15dc0 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  of the elements 
15dd0 61 72 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20  are.    ** ever 
15de0 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20  transformed, so 
15df0 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
15e00 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74  nything to delet
15e10 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15e20 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
15e30 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
15e40 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
15e50 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
15e60 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
15e70 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71  D_FREE ){.    sq
15e80 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
15e90 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
15ea0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15eb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
15ec0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
15ed0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
15ee0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
15ef0 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
15f00 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
15f10 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
15f20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
15f30 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
15f40 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
15f50 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
15f60 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
15f70 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
15f80 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
15f90 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
15fa0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
15fb0 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
15fc0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
15fd0 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
15fe0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
15ff0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
16000 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
16010 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
16020 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
16030 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
16040 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
16050 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
16060 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16070 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
16080 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
16090 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
160a0 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
160b0 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
160c0 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
160d0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
160e0 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
160f0 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
16100 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
16110 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
16120 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
16130 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
16140 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
16150 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
16160 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
16170 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
16180 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
16190 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
161a0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
161b0 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
161c0 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
161d0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
161e0 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
161f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55  ..**.** If the U
16200 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
16210 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74  OWID flag is set
16220 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
16230 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68  byte of.** the h
16240 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69  eader of pKey1 i
16250 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69  s ignored.  It i
16260 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70  s assumed that p
16270 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  Key1 is.** an in
16280 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75  dex key, and thu
16290 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f  s ends with a ro
162a0 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20  wid value.  The 
162b0 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20  last byte.** of 
162c0 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20  the header will 
162d0 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65  therefore be the
162e0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
162f0 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e  the rowid:.** on
16300 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c  e of 1, 2, 3, 4,
16310 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d   5, 6, 8, or 9 -
16320 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72   the integer ser
16330 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68  ial types..** Th
16340 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
16350 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
16360 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
16370 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
16380 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68  * By ignoring th
16390 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  is last byte of 
163a0 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66  the header, we f
163b0 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  orce the compari
163c0 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  son.** to ignore
163d0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
163e0 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a  e end of key1..*
163f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16400 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
16410 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
16420 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
16430 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
16440 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16450 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
16460 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
16470 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20  {.  int d1;     
16480 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16490 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
164a0 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
164b0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
164c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
164d0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
164e0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
164f0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
16500 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
16510 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16520 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
16530 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
16540 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20  t nField;.  int 
16550 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
16560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
16570 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
16580 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
16590 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
165a0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
165b0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
165c0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
165d0 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
165e0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
165f0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
16600 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
16610 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
16620 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
16630 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
16640 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16650 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
16660 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
16670 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
16680 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
16690 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
166a0 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
166b0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
166c0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
166d0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
166e0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
166f0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
16700 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
16710 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
16720 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
16730 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
16740 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
16750 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
16760 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c 69  be used initiali
16770 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
16780 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
16790 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
167a0 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
167b0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
167c0 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
167d0 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
167e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
167f0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
16800 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
16810 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
16820 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
16830 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
16840 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
16850 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16860 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
16870 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
16880 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
16890 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
168a0 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
168b0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
168c0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
168d0 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
168e0 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
168f0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16900 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
16910 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
16920 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
16930 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16940 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
16950 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
16960 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
16970 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16980 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
16990 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
169a0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
169b0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
169c0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
169d0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
169e0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
169f0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
16a00 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
16a10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16a20 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16a30 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
16a40 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
16a50 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
16a60 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
16a70 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
16a80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16a90 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
16aa0 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
16ab0 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
16ac0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
16ad0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
16ae0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
16af0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
16b00 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
16b30 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16b40 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
16b50 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
16b60 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
16b70 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
16b80 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
16b90 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w */..      /* I
16ba0 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
16bb0 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
16bc0 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
16bd0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
16be0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
16bf0 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20  der && i<nField 
16c00 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
16c10 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
16c20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
16c30 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
16c40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
16c50 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
16c60 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
16c70 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
16c80 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
16c90 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
16ca0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
16cb0 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
16cc0 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
16cd0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
16ce0 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
16cf0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
16d00 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
16d10 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
16d20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
16d30 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
16d40 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
16d50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16d60 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
16d70 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
16d80 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
16d90 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
16da0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
16db0 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
16dc0 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
16dd0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
16de0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
16df0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
16e00 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
16e10 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
16e20 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
16e30 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
16e40 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
16e50 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
16e60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
16e70 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
16e80 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
16e90 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
16ea0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
16eb0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
16ec0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
16ed0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
16ee0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
16ef0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
16f00 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
16f10 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
16f20 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
16f30 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
16f40 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16f50 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
16f60 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
16f70 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
16f80 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
16f90 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
16fa0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
16fb0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
16fc0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
16fd0 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
16fe0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
16ff0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
17000 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
17010 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
17020 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
17030 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
17040 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
17050 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
17060 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
17070 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
17080 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
17090 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
170a0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
170b0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
170c0 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
170d0 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
170e0 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
170f0 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
17100 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
17110 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
17120 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17130 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
17140 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
17150 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
17160 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
17170 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
17180 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
17190 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
171a0 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
171b0 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
171c0 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
171d0 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
171e0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
171f0 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
17200 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
17210 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
17220 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
17230 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
17240 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
17250 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
17260 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
17270 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
17280 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
17290 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
172a0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
172b0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
172c0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
172d0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
172e0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
172f0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
17300 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
17310 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17320 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
17330 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
17340 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
17350 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
17360 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
17370 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17380 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
17390 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
173a0 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
173b0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
173c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
173d0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
173e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
173f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
17400 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
17410 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
17420 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17430 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
17440 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17450 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
17460 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17470 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17480 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17490 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
174a0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
174b0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
174c0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
174d0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
174e0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
174f0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
17500 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
17510 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
17520 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
17530 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17540 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
17550 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
17560 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17570 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17580 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17590 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
175a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
175b0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
175c0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
175d0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
175e0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
175f0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
17600 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17610 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17620 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17630 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17640 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17650 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17660 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17670 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17680 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17690 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
176a0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
176b0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
176c0 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
176d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
176e0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
176f0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
17700 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17710 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17720 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17730 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17740 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17750 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17760 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17770 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17780 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17790 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
177a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
177b0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
177c0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
177d0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
177e0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
177f0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17800 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17810 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17820 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17830 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17840 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17850 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17860 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17870 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17880 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17890 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
178a0 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
178b0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
178c0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
178d0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
178e0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
178f0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
17900 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17910 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17920 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17930 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17940 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17950 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17960 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17970 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17980 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17990 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
179a0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
179b0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
179c0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
179d0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
179e0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
179f0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
17a00 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17a10 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17a20 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17a30 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17a40 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17a50 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17a60 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
17a70 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
17a80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17a90 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17aa0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
17ab0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
17ac0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
17ad0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
17ae0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
17af0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
17b00 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
17b10 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
17b20 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
17b30 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
17b40 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
17b50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17b60 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
17b70 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
17b80 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
17b90 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
17ba0 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
17bb0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
17bc0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
17bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17be0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
17bf0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
17c00 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
17c10 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
17c20 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17c30 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17c40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17c50 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
17c60 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
17c70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
17c80 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
17c90 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
17ca0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
17cb0 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
17cc0 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
17cd0 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
17ce0 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
17cf0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
17d00 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
17d10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
17d20 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
17d30 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
17d40 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
17d50 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
17d60 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
17d70 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
17d80 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
17d90 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
17da0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
17db0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
17dc0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
17dd0 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
17de0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
17df0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
17e00 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
17e10 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
17e20 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
17e30 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
17e40 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
17e50 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
17e60 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
17e70 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
17e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17e90 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
17ea0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
17eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17ec0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
17ed0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
17ee0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
17ef0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
17f00 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
17f10 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
17f20 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
17f30 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f50 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
17f60 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
17f70 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
17f80 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
17f90 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
17fa0 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
17fb0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
17fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17fd0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
17fe0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
17ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18000 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
18010 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
18020 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
18030 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
18040 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
18050 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18060 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18070 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18080 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18090 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
180a0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
180b0 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
180c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
180d0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
180e0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
180f0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
18100 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
18110 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
18120 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
18130 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
18140 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18150 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
18160 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18170 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18180 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18190 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
181a0 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
181b0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
181c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
181d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
181e0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
181f0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
18200 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
18210 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
18220 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
18230 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
18240 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
18250 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18260 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18280 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18290 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
182a0 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
182b0 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
182c0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
182d0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
182e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
182f0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
18300 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
18310 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
18320 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
18330 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
18340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18350 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18360 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18370 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18380 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18390 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
183a0 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
183b0 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
183c0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
183d0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
183e0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
183f0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
18400 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
18410 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
18420 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
18430 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
18440 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
18450 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
18460 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18470 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18480 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18490 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
184a0 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
184b0 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
184c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
184d0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
184e0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
184f0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
18500 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
18510 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
18520 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
18530 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
18540 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
18550 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18560 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18570 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18580 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18590 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
185a0 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
185b0 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
185c0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
185d0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
185e0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
185f0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
18600 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18610 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18620 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18630 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18640 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18650 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18660 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18670 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18680 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18690 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
186a0 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
186b0 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
186c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
186d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
186e0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
186f0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
18700 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18710 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18720 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18730 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18740 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18750 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18760 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18770 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18780 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18790 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
187a0 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
187b0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
187c0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
187d0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
187e0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
187f0 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
18800 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18810 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18820 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18830 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18840 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18850 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18860 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18870 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18880 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18890 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
188a0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
188b0 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
188c0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
188d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
188e0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
188f0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
18900 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18910 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18920 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18930 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18940 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18950 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18960 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18970 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18990 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
189a0 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
189b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
189c0 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
189d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
189e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
189f0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
18a00 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18a10 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18a20 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18a30 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18a40 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18a50 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18a60 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
18a70 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
18a80 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
18a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18aa0 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
18ab0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18ac0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18ad0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
18ae0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
18af0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
18b00 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
18b10 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
18b20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
18b30 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
18b40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18b50 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
18b60 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
18b70 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
18b80 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
18b90 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
18ba0 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
18bb0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
18bc0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
18bd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
18be0 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
18bf0 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
18c00 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
18c10 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
18c20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
18c30 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
18c40 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
18c50 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
18c60 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
18c70 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
18c80 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
18c90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18ca0 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
18cb0 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
18ce0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
18cf0 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
18d00 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
18d10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
18d20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
18d30 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
18d40 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
18d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
18d70 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
18d80 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
18d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
18da0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
18db0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
18dc0 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
18dd0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
18de0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
18df0 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
18e00 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e20 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
18e30 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
18e40 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
18e50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18e60 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
18e70 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
18e80 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
18e90 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
18ea0 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
18eb0 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
18ec0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
18ed0 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  ->zName;..  asse
18ee0 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
18ef0 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
18f00 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
18f10 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
18f20 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
18f30 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
18f40 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
18f50 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
18f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
18f70 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
18f80 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
18f90 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
18fa0 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
18fb0 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
18fc0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
18fd0 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
18fe0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
18ff0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
19000 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
19010 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
19020 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
19030 2e 6e 46 69 65 6c 64 20 3d 20 70 43 73 72 2d 3e  .nField = pCsr->
19040 6e 46 69 65 6c 64 3b 0a 20 20 70 72 65 75 70 64  nField;.  preupd
19050 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
19060 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
19070 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
19080 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65 79 20  preupdate.iPKey 
19090 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a  = pTab->iPKey;..
190a0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
190b0 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20   = &preupdate;. 
190c0 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
190d0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65  allback(db->pPre
190e0 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f  UpdateArg, db, o
190f0 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  p, zDb, zTbl, iK
19100 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64  ey1, iKey2);.  d
19110 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
19120 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
19130 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
19140 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  .aRecord);.  if(
19150 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61   preupdate.pUnpa
19160 63 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  cked ){.    sqli
19170 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
19180 61 63 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75  ackedRecord(preu
19190 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
191a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 75  ;.  }.  if( preu
191b0 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b  pdate.pNewUnpack
191c0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
191d0 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
191e0 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75 70 64  kedRecord(preupd
191f0 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
19200 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65  );.  }.  if( pre
19210 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
19220 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
19230 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
19240 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
19250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
19260 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
19270 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
19280 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
19290 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
192a0 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d  ate.aNew);.  }.}
192b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
192c0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
192d0 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.