/ Hex Artifact Content
Login

Artifact b7c245fe73ed15090cf626f1250dcb7cdcfb1bd6:


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 23 69 66 64 65 66  _NOTUSED;.#ifdef
0f60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0f70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0f80: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
0f90: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
0fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
0fb0: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
0fc0: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  p[i]);.#endif.#i
0fd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
0fe0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
0ff0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1000: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1010: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1030: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1040: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1060: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1080: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
1090: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
10a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10b0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
10c0: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
10d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
10e0: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
10f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1100: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1120: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1130: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   0);.}.../*.** A
1140: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
1150: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
1160: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69  4 value as a poi
1170: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1190: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
11b0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
11c0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11e0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
11f0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1220: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
1230: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
1240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1260: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
1270: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1280: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP4,    /* The P
1290: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
12a0: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
12b0: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
12c0: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
12d0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
12e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12f0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1310: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP4(p, addr, zP
1320: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65  4, p4type);.  re
1330: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1340: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
1350: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
1360: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1370: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
1380: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1390: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
13a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
13b0: 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
13c0: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
13d0: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
13e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
13f0: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
1400: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1410: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
1420: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
1430: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
1440: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
1450: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
1460: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
1470: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1480: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
1490: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
14a0: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
14b0: 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d   j;.  int addr =
14c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d0: 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(p, OP_ParseSc
14e0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29  hema, iDb, 0, 0)
14f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1500: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1510: 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41   zWhere, P4_DYNA
1520: 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  MIC);.  for(j=0;
1530: 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a   j<p->db->nDb; j
1540: 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55  ++) sqlite3VdbeU
1550: 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a  sesBtree(p, j);.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1570: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1580: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1590: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  e as an integer.
15a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15b0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
15c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
15d0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
15e0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
15f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1610: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1620: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1630: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1640: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1650: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1660: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1670: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1690: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
16a0: 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20    int p4        
16b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
16c0: 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e  operand as an in
16d0: 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  teger */.){.  in
16e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
16f0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1700: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1720: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51  geP4(p, addr, SQ
1730: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1740: 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  p4), P4_INT32);.
1750: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1760: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1770: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
1780: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
1790: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
17a0: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
17b0: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
17c0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
17d0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
17e0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
17f0: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
1800: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
1810: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
1820: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
1830: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
1840: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
1850: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
1860: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
1870: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
1880: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
1890: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
18a0: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
18b0: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
18c0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
18d0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
18e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
18f0: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
1900: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1910: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
1920: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
1930: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
1940: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
1950: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
1960: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
1970: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
1980: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
1990: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
19a0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
19b0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
19c0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
19d0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
19e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19f0: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
1a00: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
1a10: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
1a20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1a30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
1a40: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
1a50: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
1a60: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1a70: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1a80: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
1ac0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
1ad0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
1ae0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1af0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
1b00: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1b10: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1b20: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1b30: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1b40: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1b50: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1b60: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1b70: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1b80: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1b90: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1ba0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1bc0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1be0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1bf0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1c00: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1c10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1c20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1c30: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1c40: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1c50: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1c60: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1c70: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1c80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
1c90: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
1ca0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
1cb0: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
1cc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cd0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
1ce0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
1cf0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
1d00: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1d10: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
1d20: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1d30: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
1d40: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d50: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
1d60: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
1d70: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1d80: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
1d90: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
1da0: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
1db0: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
1dc0: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
1dd0: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
1de0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
1df0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
1e00: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
1e10: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
1e20: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
1e30: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
1e40: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
1e50: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
1e60: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
1e70: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
1ea0: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
1eb0: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
1ec0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
1ed0: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
1ee0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
1ef0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
1f00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
1f10: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
1f20: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
1f30: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
1f40: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
1f50: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
1f60: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
1f90: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1fa0: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
1fb0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
1fc0: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
1fd0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
1fe0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
1ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2000: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2010: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
2020: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2050: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2060: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
2070: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
2090: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
20a0: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
20b0: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
20c0: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
20d0: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
20e0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
20f0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
2100: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
2110: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
2120: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
2130: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
2140: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
2150: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
2160: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2170: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
2180: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
2190: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
21a0: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
21b0: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
21c0: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
21d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21e0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
21f0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
2200: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
2210: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
2220: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
2230: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
2240: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
2250: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
2260: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
2270: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
2280: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
2290: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
22a0: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
22b0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
22c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
22d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
22e0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
22f0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
2300: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
2310: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
2320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2330: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
2340: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
2350: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2360: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
2370: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
2380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2390: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
23a0: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
23b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23c0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
23d0: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
23e0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
23f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2400: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2410: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2420: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2430: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
2440: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
2450: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
2460: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
2470: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
2480: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
2490: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
24a0: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
24b0: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
24c0: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
24d0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
24e0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
24f0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
2500: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
2510: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
2520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2530: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2540: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2550: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2560: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2570: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
2580: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
2590: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
25a0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
25b0: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
25c0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
25d0: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
25e0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
25f0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
2600: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
2610: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2620: 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54  straint).**.** T
2630: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
2640: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
2650: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
2660: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
2670: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
2680: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2690: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
26a0: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
26b0: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
26c0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
26d0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
26e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
26f0: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
2700: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
2710: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
2720: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
2730: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
2740: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2750: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
2760: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
2770: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
2780: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
2790: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
27a0: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
27b0: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
27c0: 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ort = 0;.  Op *p
27d0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
27e0: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
27f0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
2800: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
2810: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
2820: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2830: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
2840: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
2850: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
2860: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
2870: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
2880: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
2890: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
28a0: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e  OP_VRename .#ifn
28b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
28d0: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
28e0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
28f0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
2900: 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20  p2==1) .#endif. 
2910: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
2920: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
2930: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
2940: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70 4f  l) .      && (pO
2950: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
2960: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
2970: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
2980: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
2990: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
29a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29b0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
29c0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
29d0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
29e0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
29f0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
2a00: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
2a10: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
2a20: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2a30: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2a40: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2a50: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2a60: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2a70: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2a80: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2a90: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2aa0: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2ab0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
2ac0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
2ad0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
2ae0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
2af0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
2b00: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
2b10: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2b20: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2b30: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2b40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b50: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2b60: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2b70: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2b80: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2b90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2ba0: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2bb0: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2bc0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2bd0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2be0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2bf0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2c00: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2c10: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2c20: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2c30: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2c40: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2c50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2c70: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2c80: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2c90: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2ca0: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2cb0: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2cc0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2cd0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2ce0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2cf0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2d00: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2d10: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2d20: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2d30: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2d40: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2d50: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2d60: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2d70: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2d80: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2d90: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2da0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2db0: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2dc0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2dd0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2de0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2df0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2e00: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2e10: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2e20: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2e30: 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70  y = 1;.  for(pOp
2e40: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2e50: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2e60: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2e70: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2e80: 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f  ode;..    pOp->o
2e90: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
2ea0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
2eb0: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
2ec0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2ed0: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2ee0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
2ef0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
2f00: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2f10: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
2f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 63    }else if( (opc
2f30: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2f40: 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d  ion && pOp->p2!=
2f50: 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  0) || opcode==OP
2f60: 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  _Vacuum ){.     
2f70: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2f80: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2f90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2fa0: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2fb0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2fc0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
2fd0: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
2fe0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ff0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73  Op->p2;.    }els
3000: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
3010: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
3020: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
3030: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
3040: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
3050: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
3060: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
3070: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
3080: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
3090: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
30a0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
30b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
30c0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
30d0: 5f 4e 65 78 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Next || opcode=
30e0: 3d 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 20 29  =OP_SorterNext )
30f0: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3100: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3110: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3120: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3130: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
3140: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3150: 65 3d 3d 4f 50 5f 50 72 65 76 20 29 7b 0a 20 20  e==OP_Prev ){.  
3160: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3170: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3180: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
3190: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
31a0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
31b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
31c0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
31d0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
31e0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
31f0: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3200: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
3210: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3220: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3230: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3250: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
3260: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
3270: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
3280: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
3290: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32a0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
32b0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
32c0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
32d0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
32e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
32f0: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3300: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3310: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3320: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3330: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3340: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3350: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
3360: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
3370: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
3380: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
3390: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
33a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
33b0: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
33c0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
33d0: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
33e0: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
33f0: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3400: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3410: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3420: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3430: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3440: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
3450: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
3460: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
3470: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
3480: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
3490: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
34a0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
34b0: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
34c0: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
34d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
34e0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
34f0: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3500: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3510: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3520: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3530: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3540: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
3550: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
3560: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
3570: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
3580: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
3590: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
35a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
35b0: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
35c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
35d0: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
35e0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
35f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3600: 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  rt( p->btreeMask
3610: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  ==0 );..  resolv
3620: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
3630: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
3640: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
3650: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
3660: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
3670: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
3680: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
3690: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
36a0: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
36b0: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
36c0: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
36d0: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
36e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
36f0: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
3700: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
3710: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
3720: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3730: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3740: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3750: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3760: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
3770: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3780: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3790: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
37a0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
37b0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
37c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
37d0: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
37e0: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
37f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3800: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3810: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3820: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3830: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3840: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3850: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3860: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3870: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
3880: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3890: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71   if( p2<0 && (sq
38a0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
38b0: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
38c0: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
38d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
38e0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
38f0: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3910: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3920: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
3930: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
3940: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
3950: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3960: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
3970: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
3980: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
3990: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
39a0: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
39b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
39c0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
39d0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
39e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
39f0: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3a00: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3a10: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3a20: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3a30: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
3a40: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
3a50: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a60: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3a70: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
3a80: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3a90: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3aa0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3ab0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3ac0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3ad0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3ae0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3af0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3b00: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3b10: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3b20: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3b30: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3b40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b50: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
3b60: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3b70: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3b80: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3b90: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3ba0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3bb0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
3bc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3bd0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3be0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3bf0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3c00: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3c10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3c20: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3c30: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3c40: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3c50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3c60: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3c70: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3c80: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3c90: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3ca0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3cb0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3cc0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3cd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3ce0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3cf0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3d00: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3d10: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3d30: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
3d40: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3d50: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3d60: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
3d70: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
3d80: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
3d90: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3da0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3db0: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
3dc0: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
3dd0: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
3de0: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
3df0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3e00: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
3e10: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
3e20: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3e30: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
3e40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3e50: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
3e60: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
3e70: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3e80: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
3e90: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
3ea0: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
3eb0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
3ec0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
3ed0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ee0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
3ef0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
3f00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3f10: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
3f20: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3f30: 61 64 64 72 3e 3d 30 20 7c 7c 20 70 2d 3e 64 62  addr>=0 || p->db
3f40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3f50: 3b 0a 20 20 69 66 28 20 61 64 64 72 3e 3d 30 20  ;.  if( addr>=0 
3f60: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
3f70: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3f80: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3f90: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3fa0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3fb0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3fc0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3fd0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3fe0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3ff0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
4000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4010: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4020: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
4030: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
4040: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
4050: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
4060: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
4070: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
4080: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4090: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
40a0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
40b0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
40c0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
40d0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
40e0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
40f0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
4100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4110: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
4120: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
4130: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
4140: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
4150: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
4160: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
4170: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
4180: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4190: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
41a0: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
41b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
41c0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
41d0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
41e0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
41f0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
4200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4210: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4230: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4240: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4250: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4260: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
4280: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
42a0: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
42b0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
42c0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
42d0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
42e0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
42f0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
4300: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4310: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4320: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4330: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4340: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4350: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4370: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4380: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4390: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
43a0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
43b0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
43c0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
43d0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
43e0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
43f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4400: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4410: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4420: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4440: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4450: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4460: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4470: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4480: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
44a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
44b0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
44c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44d0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
44e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
44f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4500: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4510: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4520: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4530: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4540: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4550: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4560: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4570: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4580: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4590: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
45a0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
45b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
45c0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
45d0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
45e0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
45f0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4600: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4610: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4630: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4640: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4650: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4660: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4670: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4680: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4690: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
46a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
46b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
46c0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
46d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
46e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
46f0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
4700: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4710: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4720: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4730: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4740: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4750: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4760: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
4770: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
4780: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4790: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
47a0: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
47b0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
47c0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
47d0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
47e0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
47f0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
4800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4810: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4820: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4830: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4840: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4850: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4860: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
4870: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
4880: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
4890: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
48a0: 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  op.*/.void sqlit
48b0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
48c0: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
48d0: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  addr){.  if( p->
48e0: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
48f0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4900: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4910: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4920: 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20  .    freeP4(db, 
4930: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4940: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d  ->p4.p);.    mem
4950: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
4960: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
4970: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4980: 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  P_Noop;.  }.}../
4990: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
49a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
49b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
49c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
49d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
49e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
49f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
4a00: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
4a10: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
4a20: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
4a30: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
4a40: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
4a50: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
4a60: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
4a70: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
4a80: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
4a90: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
4aa0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
4ab0: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
4ac0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
4ad0: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
4ae0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4af0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4b00: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
4b10: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
4b20: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
4b30: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
4b40: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
4b50: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
4b60: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
4b70: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a  tes of zP4..**.*
4b80: 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  * If n==P4_KEYIN
4b90: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
4ba0: 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   zP4 is a pointe
4bb0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
4bc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
4bd0: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
4be0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
4bf0: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
4c00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
4c10: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
4c20: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
4c30: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
4c40: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
4c50: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4c60: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
4c70: 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  t zP4 points to 
4c80: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4c90: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
4ca0: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
4cb0: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
4cc0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cd0: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
4ce0: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
4cf0: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
4d00: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
4d10: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
4d20: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
4d30: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
4d40: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
4d50: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
4d60: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
4d70: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
4d80: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
4d90: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
4da0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
4db0: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
4dc0: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
4dd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
4de0: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
4df0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
4e00: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
4e10: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
4e20: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
4e30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
4e40: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
4e50: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4e70: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
4e80: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
4e90: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
4ea0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
4eb0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
4ec0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
4ed0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
4ee0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4ef0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4f00: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
4f10: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4f20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
4f30: 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26   n!=P4_KEYINFO &
4f40: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b  & n!=P4_VTAB ) {
4f50: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f60: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
4f70: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
4f80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
4f90: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
4fa0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4fb0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
4fc0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
4fd0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
4fe0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
4ff0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5000: 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20  ];.  freeP4(db, 
5010: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
5020: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
5030: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
5040: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
5050: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
5060: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
5070: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
5080: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
5090: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
50a0: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
50b0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
50c0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
50d0: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
50e0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
50f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5100: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
5110: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
5120: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
5130: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5140: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5150: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5160: 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
5170: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
5180: 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65  fo;.    int nFie
5190: 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  ld, nByte;..    
51a0: 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e  nField = ((KeyIn
51b0: 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64  fo*)zP4)->nField
51c0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
51d0: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20  zeof(*pKeyInfo) 
51e0: 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a  + (nField-1)*siz
51f0: 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  eof(pKeyInfo->aC
5200: 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64  oll[0]) + nField
5210: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
5220: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5230: 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20  Raw(0, nByte);. 
5240: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
5250: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
5260: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
5270: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53   ){.      u8 *aS
5280: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
5290: 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b  memcpy((char*)pK
52a0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
52b0: 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20  te - nField);.  
52c0: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
52d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
52e0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
52f0: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
5300: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
5310: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5320: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
5330: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
5340: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
5350: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
5360: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
5370: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
5380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5390: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
53a0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
53b0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
53c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
53d0: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
53e0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
53f0: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
5400: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
5410: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5430: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5440: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5450: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
5460: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
5470: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5480: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5490: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
54a0: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
54b0: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
54c0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
54d0: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
54e0: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
54f0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
5500: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
5510: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5520: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5530: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
5540: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
5550: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
5560: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5570: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
5580: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
5590: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
55a0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
55b0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
55c0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
55d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
55e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
55f0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
5600: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5610: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
5620: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
5630: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
5640: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
5650: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
5660: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
5670: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
5680: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
5690: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
56a0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
56b0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
56c0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
56d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56e0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
56f0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5700: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
5710: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
5720: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
5730: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
5740: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
5750: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
5760: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
5770: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
5780: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
5790: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
57a0: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
57b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
57c0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
57d0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
57e0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
57f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5800: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
5810: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5820: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5840: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5860: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5870: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5880: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
5890: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
58a0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
58b0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
58c0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
58d0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
58e0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
58f0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5900: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5910: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5920: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
5930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5940: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
5950: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
5960: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5970: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
5980: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5990: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
59a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
59b0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
59c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
59d0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
59e0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
59f0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
5a00: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
5a10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5a20: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
5a30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
5a40: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5a50: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5a60: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
5a70: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
5a80: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
5a90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
5aa0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
5ab0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
5ac0: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
5ad0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
5ae0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
5af0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
5b00: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
5b10: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
5b20: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
5b30: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
5b40: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
5b50: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
5b60: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5b70: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
5b80: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
5b90: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
5ba0: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
5bb0: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5bc0: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
5bd0: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
5be0: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
5bf0: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
5c00: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
5c10: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
5c20: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
5c30: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
5c40: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
5c50: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20  nd..**.** About 
5c60: 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49 54  the #ifdef SQLIT
5c70: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e  E_OMIT_TRACE:  N
5c80: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  ormally, this ro
5c90: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
5ca0: 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20  alled.** unless 
5cb0: 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20  p->nOp>0.  This 
5cc0: 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
5cd0: 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c  e absense of SQL
5ce0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a  ITE_OMIT_TRACE,.
5cf0: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69  ** an OP_Trace i
5d00: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
5d10: 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62 79  ways inserted by
5d20: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 28   sqlite3VdbeGet(
5d30: 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  ) as soon as.** 
5d40: 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63 72  a new VDBE is cr
5d50: 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72  eated.  So we ar
5d60: 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61 64  e free to set ad
5d70: 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77  dr to p->nOp-1 w
5d80: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5d90: 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   to double-check
5da0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5db0: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  at the result is
5dc0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42   non-negative. B
5dd0: 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ut.** if SQLITE_
5de0: 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64 65  OMIT_TRACE is de
5df0: 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72  fined, the OP_Tr
5e00: 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61  ace is omitted a
5e10: 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f  nd we do need to
5e20: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61  .** check the va
5e30: 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20  lue of p->nOp-1 
5e40: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
5e50: 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  g..*/.VdbeOp *sq
5e60: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
5e70: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5e80: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
5e90: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
5ea0: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
5eb0: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
5ec0: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
5ed0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
5ee0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
5ef0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
5f00: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
5f10: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
5f20: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
5f30: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
5f40: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
5f50: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
5f60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5f70: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5f80: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5f90: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5fb0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5fc0: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
5fd0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
5fe0: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
5ff0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6000: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6010: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6020: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6030: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6040: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6050: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6060: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6070: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6080: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6090: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
60a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
60b0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
60c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
60d0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
60e0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
60f0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
6100: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
6110: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6120: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6130: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
6140: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
6150: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
6160: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
6170: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
6180: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
6190: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
61a0: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
61b0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
61c0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
61d0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
61e0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
61f0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
6200: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
6210: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
6220: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
6230: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
6240: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6250: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
6260: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
6270: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
6280: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6290: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
62a0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
62b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
62c0: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
62d0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
62e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
62f0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
6300: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
6310: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6320: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
6330: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
6340: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6350: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
6370: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
6380: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6390: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
63a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
63b0: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
63c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
63d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
63e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
63f0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
6400: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
6410: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
6420: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
6430: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
6440: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
6450: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
6460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6470: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6480: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
6490: 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,n+1);.         
64a0: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
64b0: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
64c0: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
64d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
64e0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a  p[i],",nil",4);.
64f0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
6500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6510: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
6520: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
6530: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
6540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
6550: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
6560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6570: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
6580: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
6590: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
65a0: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
65b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
65c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
65d0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
65e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
65f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6600: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
6610: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
6620: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
6630: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
6640: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6650: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6660: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
6670: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
6680: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
6690: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
66a0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
66b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
66c0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
66d0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
66e0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
66f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6700: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
6710: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6720: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6730: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
6740: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
6750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6760: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
6770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6780: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6790: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
67a0: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
67b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
67c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
67d0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
67e0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
67f0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
6800: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6810: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
6820: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
6830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6840: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6850: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6860: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6870: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6880: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6890: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
68a0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
68b0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
68c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
68d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68e0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
68f0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
6900: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6910: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6930: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6940: 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22  p, zTemp, "NULL"
6950: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6960: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6970: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6980: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
6990: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
69a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
69c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
69d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
69e0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
69f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6a00: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
6a10: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
6a20: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
6a30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6a40: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
6a50: 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56  p:%p", pVtab, pV
6a60: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20  tab->pModule);. 
6a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6a90: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
6aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6ab0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6ac0: 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22  Temp, "intarray"
6ad0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ae0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6af0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
6b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6b10: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6b20: 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  emp, "program");
6b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6b50: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
6b60: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6b70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6b90: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
6ba0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
6bb0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
6bc0: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
6bd0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
6be0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
6bf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6c00: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
6c10: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
6c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
6c30: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
6c40: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
6c50: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
6c60: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
6c70: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
6c80: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
6c90: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
6ca0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
6cb0: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
6cc0: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
6cd0: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
6ce0: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
6cf0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
6d00: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
6d10: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
6d20: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
6d30: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
6d40: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
6d50: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
6d60: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
6d70: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
6d80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
6d90: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
6da0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
6db0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
6dc0: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
6dd0: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
6de0: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6df0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6e00: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6e10: 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  .  p->btreeMask 
6e20: 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
6e30: 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  <i;.  if( i!=1 &
6e40: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
6e50: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
6e60: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
6e70: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20   p->lockMask |= 
6e80: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6e90: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
6ea0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6eb0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
6ec0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
6ed0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
6ee0: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
6ef0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
6f00: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
6f10: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
6f20: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
6f30: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
6f40: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
6f50: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
6f60: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
6f70: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
6f80: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
6f90: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
6fa0: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
6fb0: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
6fc0: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
6fd0: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
6fe0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
6ff0: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
7000: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
7010: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
7020: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
7030: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
7040: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
7050: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
7060: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
7070: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
7080: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
7090: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
70a0: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
70b0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
70c0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
70d0: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
70e0: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
70f0: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
7100: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
7110: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
7120: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7130: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
7140: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
7150: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
7160: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
7170: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7180: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
7190: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
71a0: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
71b0: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
71c0: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
71d0: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
71e0: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
71f0: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
7200: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
7210: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
7220: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
7230: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
7240: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
7250: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
7260: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
7270: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
7280: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
7290: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
72a0: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
72b0: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
72c0: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
72d0: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
72e0: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
72f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
7300: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
7310: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7320: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
7330: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
7340: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
7350: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
7360: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
7370: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
7380: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
7390: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
73a0: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
73b0: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
73c0: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
73d0: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
73e0: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
73f0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
7400: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7420: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
7430: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
7440: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
7450: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7460: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
7470: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
7480: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
7490: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
74a0: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
74b0: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
74c0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
74d0: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nter()..*/.void 
74e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
74f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7500: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7510: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7520: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7530: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7540: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7550: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7560: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7570: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7580: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7590: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
75a0: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
75b0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
75c0: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
75d0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
75e0: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
75f0: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7600: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7620: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
7630: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7640: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
7650: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
7660: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
7670: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
7680: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
7690: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
76a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
76b0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
76c0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
76d0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
76e0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
76f0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
7700: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
7710: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
7720: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7730: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
7740: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
7750: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
7760: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
7770: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
7780: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
7790: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
77a0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
77b0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
77c0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
77d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
77e0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
77f0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
7800: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
7810: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
7820: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7830: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
7840: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
7850: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
7860: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
7870: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
7880: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
7890: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
78a0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
78b0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
78c0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
78d0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
78e0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
78f0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
7900: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
7910: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
7920: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c    u8 malloc_fail
7930: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
7940: 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64  ailed;.    if( d
7950: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
7960: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e  ){.      for(pEn
7970: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
7980: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   p++){.        s
7990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
79a0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
79b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
79c0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  rn;.    }.    fo
79d0: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
79e0: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
79f0: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
7a00: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
7a10: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
7a20: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
7a30: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
7a40: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
7a50: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
7a60: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
7a70: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
7a80: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
7a90: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
7aa0: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
7ab0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
7ac0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
7ad0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
7ae0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
7af0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
7b00: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
7b10: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
7b20: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
7b30: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
7b40: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
7b50: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
7b60: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
7b70: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
7b80: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
7b90: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
7ba0: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
7bb0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
7bc0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
7bd0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
7be0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
7bf0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
7c00: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
7c10: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
7c20: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
7c30: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
7c40: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
7c50: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
7c60: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
7c70: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
7c80: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
7c90: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
7ca0: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
7cb0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
7cc0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
7cd0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
7ce0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
7cf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7d00: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
7d10: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
7d20: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
7d30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7d40: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7d50: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
7d60: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f  se if( p->zMallo
7d70: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7d80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7d90: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
7da0: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d      p->zMalloc =
7db0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
7dc0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
7dd0: 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d  M_Invalid;.    }
7de0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
7df0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
7e00: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
7e10: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
7e20: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
7e30: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
7e40: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
7e50: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
7e60: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
7e70: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
7e80: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
7e90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7ea0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
7eb0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
7ec0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
7ed0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
7ee0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
7ef0: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
7f00: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
7f10: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
7f20: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
7f30: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
7f40: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
7f50: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
7f60: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
7f70: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
7f80: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
7f90: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
7fa0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
7fb0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
7fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7fd0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
7fe0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
7ff0: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
8000: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8010: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
8020: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
8030: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
8040: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
8050: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
8060: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
8070: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
8080: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
8090: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
80a0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
80b0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
80c0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
80d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
80e0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
80f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
8100: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
8110: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
8120: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
8130: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
8140: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
8150: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
8160: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
8170: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
8180: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
8190: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
81a0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
81b0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
81c0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
81d0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
81e0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
81f0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
8200: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8210: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
8220: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
8230: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
8240: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8260: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
8270: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
82a0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
82b0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
82c0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
82f0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
8300: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
8310: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
8320: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8330: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
8340: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
8350: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
8380: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
8390: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
83a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
83b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
83c0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
83d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
83e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8410: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
8420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8450: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
8460: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
8470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8480: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
8490: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
84a0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
84b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
84c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
84d0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
84e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
84f0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
8500: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
8510: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8520: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
8530: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
8540: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
8550: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
8560: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
8570: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
8580: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
8590: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
85a0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
85b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
85c0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
85d0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
85e0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
85f0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
8600: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
8610: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
8620: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
8630: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8640: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
8650: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
8660: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
8670: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
8680: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
8690: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
86a0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
86b0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
86c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
86d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
86e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
86f0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
8700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
8710: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
8720: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
8730: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
8740: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
8750: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
8760: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
8770: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
8780: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
8790: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
87a0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
87b0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
87c0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
87d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
87e0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
87f0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
8800: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
8810: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
8820: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
8830: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
8840: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8850: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
8860: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
8870: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
8880: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
8890: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
88a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
88b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
88c0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
88d0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
88e0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
88f0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
8900: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
8910: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
8920: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
8930: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
8940: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
8950: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
8960: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
8970: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
8980: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
8990: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
89a0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
89b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
89c0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
89d0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
89e0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
89f0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
8a00: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
8a10: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8a20: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
8a30: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
8a40: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
8a50: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
8a60: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
8a70: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
8a80: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
8a90: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
8aa0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
8ab0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
8ac0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
8ad0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
8ae0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
8af0: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
8b00: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
8b10: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
8b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
8b30: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
8b40: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
8b50: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
8b60: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
8b70: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
8b80: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
8b90: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
8ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8bb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8bc0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
8bd0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
8be0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
8bf0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
8c00: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
8c10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8c20: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8c30: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
8c40: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
8c50: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
8c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
8c70: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
8c80: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
8c90: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
8ca0: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
8cb0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
8cc0: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
8cd0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
8ce0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
8cf0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
8d00: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8d10: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
8d20: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
8d30: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
8d40: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
8d50: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
8d60: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
8d70: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
8d80: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
8d90: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
8da0: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
8db0: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
8dc0: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
8dd0: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
8de0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
8df0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
8e00: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
8e10: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
8e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
8e30: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8e40: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e50: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
8e60: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8e70: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8e80: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
8e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
8ec0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
8ed0: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
8ee0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8ef0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
8f00: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
8f10: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
8f20: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8f30: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
8f40: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
8f50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
8f60: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
8f70: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
8f80: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
8f90: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
8fa0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
8fb0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
8fc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8fd0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
8fe0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8ff0: 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  an OP_Program op
9000: 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  code is encounte
9010: 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f  r (the only opco
9020: 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  de that has.    
9030: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
9040: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
9050: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
9060: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
9070: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
9080: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
9090: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
90a0: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
90b0: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
90c0: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
90d0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c     ** has not al
90e0: 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e  ready been seen.
90f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9100: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
9110: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
9120: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
9130: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
9140: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
9150: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
9160: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
9170: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
9180: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9190: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
91a0: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
91b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
91c0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
91d0: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
91e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
91f0: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
9200: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
9210: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
9220: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
9230: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
9240: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
9250: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
9260: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
9270: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
9280: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
9290: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
92a0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92c0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
92d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
92e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
92f0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
9320: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9330: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
9340: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
9350: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9360: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
9370: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
93a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
93b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
93c0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
93d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
93e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
93f0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
9400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
9420: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9430: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9440: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
9450: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
9460: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
9470: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
9480: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
9490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
94a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
94b0: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
94c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
94d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
94e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
94f0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
9500: 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c  m;.    z = displ
9510: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
9520: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
9530: 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  z!=pMem->z ){.  
9540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9550: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
9560: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
9570: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
9580: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9590: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
95a0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
95b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
95c0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
95d0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
95e0: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
95f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9600: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
9610: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
9620: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
9630: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9640: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
9650: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
9660: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9670: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9680: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
9690: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
96a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
96b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
96c0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
96d0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
96e0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
96f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9700: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
9710: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
9720: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
9730: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9740: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
9750: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9760: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
9770: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
9780: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9790: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
97a0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
97b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
97c0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
97d0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
97e0: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
97f0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9800: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
9810: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
9820: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9830: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9840: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
9850: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
9860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
9870: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
9880: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9890: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
98c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
98d0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
98e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98f0: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
9900: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
9910: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
9920: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
9930: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
9940: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9950: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9960: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
9970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9980: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9990: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
99a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
99b0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
99c0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
99d0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
99e0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
99f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9a00: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
9a10: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
9a20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
9a30: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
9a40: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9a50: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9a60: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9a70: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
9a80: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
9a90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9aa0: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
9ab0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
9ac0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
9ad0: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
9ae0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
9af0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
9b00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9b10: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
9b20: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9b30: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
9b40: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
9b50: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
9b60: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
9b70: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
9b80: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
9b90: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
9ba0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9bb0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9bc0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
9bd0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
9be0: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
9bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9c00: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9c10: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9c20: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9c30: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9c40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
9c50: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
9c60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9c70: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
9c80: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
9c90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
9ca0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9cb0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
9cc0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
9cd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9ce0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9cf0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
9d00: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
9d10: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
9d20: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
9d30: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9d40: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
9d50: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
9d60: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
9d70: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
9d80: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
9d90: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9da0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9db0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
9dc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
9dd0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
9de0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
9df0: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
9e00: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
9e10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
9e20: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
9e30: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
9e40: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
9e50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
9e60: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
9e70: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
9e80: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
9e90: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
9ea0: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
9eb0: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
9ec0: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
9ed0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
9ee0: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
9ef0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
9f00: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
9f10: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
9f20: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
9f30: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
9f40: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
9f50: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
9f60: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
9f70: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
9f80: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
9f90: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
9fa0: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
9fb0: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
9fc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
9fd0: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
9fe0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
9ff0: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
a000: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
a010: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
a020: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
a030: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
a040: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
a050: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
a060: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
a070: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
a080: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
a090: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
a0a0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
a0b0: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
a0c0: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
a0d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a0e0: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
a0f0: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
a100: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
a110: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
a120: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
a130: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
a140: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
a150: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
a160: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
a170: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
a180: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
a190: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
a1a0: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
a1c0: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
a1d0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
a1e0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
a1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a200: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
a210: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
a220: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
a230: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
a240: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
a250: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
a260: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
a270: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
a280: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
a290: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
a2a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
a2b0: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
a2c0: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
a2d0: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
a2e0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
a2f0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
a300: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
a310: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
a320: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
a330: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
a340: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
a350: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
a360: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
a370: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
a380: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
a390: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
a3a0: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
a3b0: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
a3c0: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
a3d0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
a3e0: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
a3f0: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
a400: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
a410: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
a420: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
a430: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
a440: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
a450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a460: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
a470: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a480: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
a490: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
a4a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a4b0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a4c0: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
a4d0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
a4e0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
a4f0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
a500: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
a510: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
a520: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
a530: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
a540: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
a550: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
a560: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
a570: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a580: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
a590: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
a5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a5b0: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
a5c0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
a5d0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
a5e0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a5f0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
a600: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
a610: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
a620: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
a630: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
a640: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
a650: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
a660: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
a670: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
a680: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
a690: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
a6a0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
a6b0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
a6c0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
a6d0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
a6e0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
a6f0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
a700: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
a710: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
a720: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
a730: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
a740: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
a750: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
a760: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a770: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
a780: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
a790: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
a7a0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
a7b0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
a7c0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
a7d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
a7e0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
a7f0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
a800: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
a810: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
a820: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
a830: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
a840: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
a850: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f  e called exact o
a860: 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69  nce on a each vi
a870: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
a880: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
a890: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a8a0: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
a8b0: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
a8c0: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
a8d0: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
a8e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
a8f0: 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f   futher calls to
a900: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
a910: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
a920: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
a930: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a940: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
a950: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
a960: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
a970: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
a980: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
a990: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
a9a0: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
a9b0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
a9c0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
a9d0: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
a9e0: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
a9f0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
aa00: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
aa10: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
aa20: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
aa30: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
aa40: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
aa50: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
aa60: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
aa70: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
aa80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
aab0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aae0: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
aaf0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ab10: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
ab20: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
ab30: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
ab40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ab50: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
ab60: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
ab70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ab90: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
aba0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
abb0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
abd0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
abe0: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
abf0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac10: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
ac20: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
ac30: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e  ams */.  int nOn
ac40: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
ac50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac60: 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  r of OP_Once ins
ac70: 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  tructions */.  i
ac80: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aca0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
acb0: 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20  .  u8 *zCsr;    
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69    /* Memory avai
ace0: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
acf0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45  tion */.  u8 *zE
ad00: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
ad10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
ad20: 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f  t byte past allo
ad30: 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  cated memory */.
ad40: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74   /* How much ext
ad70: 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65  ra memory is nee
ad80: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
ad90: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
ada0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
adb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
adc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
add0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
ade0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
adf0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
ae00: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
ae10: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
ae20: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
ae30: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
ae40: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
ae50: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
ae60: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
ae70: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
ae80: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
ae90: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
aea0: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
aeb0: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
aec0: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
aed0: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
aee0: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
aef0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
af00: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
af10: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
af20: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
af30: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
af40: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
af50: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
af60: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
af70: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
af80: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
af90: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
afa0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
afb0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
afc0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
afd0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
afe0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
aff0: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
b000: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
b010: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
b020: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
b030: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
b040: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
b050: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
b060: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
b070: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
b080: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
b090: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
b0a0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
b0b0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
b0c0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b0d0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
b0e0: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
b0f0: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
b100: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
b110: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
b120: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
b130: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
b140: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
b150: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
b160: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b170: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b180: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
b190: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b1a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
b1b0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
b1c0: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
b1d0: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
b1e0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
b1f0: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
b200: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
b210: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
b220: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
b230: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
b240: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
b250: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
b260: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
b270: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
b280: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
b290: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
b2a0: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
b2b0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b2c0: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
b2d0: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
b2e0: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
b2f0: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
b300: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
b310: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
b320: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a  ated in two.  **
b330: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
b340: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
b350: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
b360: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
b370: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
b380: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
b390: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
b3a0: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
b3b0: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
b3c0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
b3d0: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
b3e0: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
b3f0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
b400: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
b410: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
b420: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
b430: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
b440: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
b450: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
b460: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
b470: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
b480: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
b490: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
b4a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
b4b0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
b4c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
b4d0: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
b4e0: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
b4f0: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
b500: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
b510: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79  /.  do {.    nBy
b520: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  te = 0;.    p->a
b530: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
b540: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
b550: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b560: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b570: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
b580: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
b590: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b5a0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b5b0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b5c0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
b5d0: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
b5e0: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
b5f0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b600: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b610: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
b620: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
b630: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
b640: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b650: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
b660: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
b670: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
b680: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
b690: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
b6c0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b6d0: 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63  OnceFlag = alloc
b6e0: 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c  Space(p->aOnceFl
b6f0: 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72  ag, nOnce, &zCsr
b700: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b710: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
b720: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65  {.      p->pFree
b730: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b740: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
b750: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73  );.    }.    zCs
b760: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
b770: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
b780: 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28  Byte];.  }while(
b790: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
b7a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
b7b0: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28    p->nCursor = (
b7c0: 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 70  u16)nCursor;.  p
b7d0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
b7e0: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
b7f0: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
b800: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
b810: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
b820: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
b830: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
b840: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
b850: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
b860: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
b870: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61   }.  if( p->azVa
b880: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61  r ){.    p->nzVa
b890: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61  r = pParse->nzVa
b8a0: 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  r;.    memcpy(p-
b8b0: 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  >azVar, pParse->
b8c0: 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a  azVar, p->nzVar*
b8d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b  sizeof(p->azVar[
b8e0: 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  0]));.    memset
b8f0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20  (pParse->azVar, 
b900: 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  0, pParse->nzVar
b910: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
b920: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a  azVar[0]));.  }.
b930: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b940: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20  .    p->aMem--; 
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
b970: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
b980: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   */.    p->nMem 
b990: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
b9a0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
b9b0: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
b9c0: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  m-1 */.    for(n
b9d0: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
b9e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
b9f0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ba00: 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70  Invalid;.      p
ba10: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
ba20: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  b;.    }.  }.  p
ba30: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72  ->explain = pPar
ba40: 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73  se->explain;.  s
ba50: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
ba60: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
ba70: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
ba80: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
ba90: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
baa0: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
bab0: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
bac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bad0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
bae0: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
baf0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
bb00: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
bb10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
bb20: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
bb30: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
bb40: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
bb60: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
bb70: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
bb80: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
bb90: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
bba0: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
bbb0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
bbc0: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
bbd0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
bbe0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
bbf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
bc00: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
bc10: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
bc20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bc30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
bc40: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
bc50: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
bc60: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
bc70: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
bc80: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
bc90: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
bca0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
bcb0: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
bcc0: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
bcd0: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
bce0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
bcf0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
bd00: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
bd10: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
bd20: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  if.}../*.** Copy
bd30: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
bd40: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
bd50: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
bd60: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
bd70: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
bd80: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
bd90: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
bda0: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
bdb0: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
bdc0: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
bdd0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
bde0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bdf0: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
be00: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
be10: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
be20: 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  v;.  v->aOnceFla
be30: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
be40: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
be50: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
be60: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
be70: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
be80: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
be90: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
bea0: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
beb0: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
bec0: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
bed0: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
bee0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
bef0: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
bf00: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
bf10: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
bf20: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
bf30: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
bf40: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
bf50: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
bf60: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
bf70: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
bf80: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
bf90: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
bfa0: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
bfb0: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
bfc0: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
bfd0: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
bfe0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
bff0: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
c000: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
c010: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
c020: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
c030: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
c040: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
c050: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
c060: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
c070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c080: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
c090: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
c0a0: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
c0b0: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
c0c0: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
c0d0: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
c0e0: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
c0f0: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
c100: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
c110: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
c120: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
c130: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
c140: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
c150: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
c160: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
c170: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c180: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c190: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
c1a0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
c1b0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
c1c0: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
c1d0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
c1e0: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
c1f0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
c200: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
c210: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
c220: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
c230: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
c240: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
c250: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
c260: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
c270: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
c280: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
c290: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
c2a0: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
c2b0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
c2c0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
c2d0: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
c2e0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
c2f0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
c300: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
c310: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
c320: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
c330: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
c340: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
c350: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
c360: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
c370: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
c380: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
c390: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
c3a0: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
c3b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
c3c0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
c3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c3e0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
c3f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
c400: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
c410: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
c420: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
c430: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
c440: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
c450: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
c460: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
c470: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
c480: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
c490: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
c4a0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c4b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
c4c0: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
c4d0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c4e0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
c4f0: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
c500: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
c510: 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20  gs==MEM_Invalid 
c520: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c530: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c540: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
c550: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c560: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
c570: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
c580: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
c590: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c5a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
c5b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
c5c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
c5d0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
c5e0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
c5f0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
c600: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
c610: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
c620: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
c630: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
c640: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
c650: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
c660: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
c670: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c690: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
c6a0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
c6b0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
c6c0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
c6d0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
c6e0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
c6f0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
c700: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
c710: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
c720: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
c730: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
c740: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
c750: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c760: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
c770: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
c780: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
c790: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
c7a0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
c7b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c7c0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
c7d0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
c7e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c7f0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
c800: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
c810: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c820: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
c830: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
c840: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
c850: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c860: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
c870: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
c880: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
c890: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
c8a0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
c8b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c8c0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
c8d0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
c8e0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
c8f0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
c900: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
c910: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
c920: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
c930: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
c940: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
c950: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
c960: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
c970: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
c980: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
c990: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
c9a0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c9b0: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
c9c0: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
c9d0: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
c9e0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
c9f0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
ca00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ca10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
ca20: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
ca50: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
ca60: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
ca90: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
caa0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
cab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
cad0: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
cae0: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
caf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cb00: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
cb10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
cb20: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
cb30: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
cb40: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
cb70: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
cb80: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
cb90: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
cba0: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
cbb0: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
cbc0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
cbd0: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
cbe0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
cbf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
cc00: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
cc10: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
cc20: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
cc30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cc40: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
cc50: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
cc60: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
cc70: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
cc80: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
cc90: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
cca0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
ccb0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
ccc0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
ccd0: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
cce0: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
ccf0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
cd00: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
cd10: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
cd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd30: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
cd40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
cd50: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
cd60: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
cd70: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
cd80: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
cd90: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
cda0: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
cdb0: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
cdc0: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
cdd0: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
cde0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cdf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ce00: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
ce10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ce20: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
ce30: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
ce40: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
ce50: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
ce60: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
ce70: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
ce80: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
ce90: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
cea0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
ceb0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cec0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
ced0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
cee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
cef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
cf00: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
cf10: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
cf20: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
cf30: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
cf40: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
cf50: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
cf60: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
cf70: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
cf80: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
cf90: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
cfa0: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
cfb0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
cfc0: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
cfd0: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
cfe0: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
cff0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
d000: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
d010: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
d020: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
d030: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
d040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
d050: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
d060: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
d070: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
d080: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
d090: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
d0a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d0b0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d0c0: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d  VtabSync(db, &p-
d0d0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a  >zErrMsg);..  /*
d0e0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
d0f0: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
d100: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
d110: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
d120: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
d130: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
d140: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
d150: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
d160: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
d170: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
d180: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
d190: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
d1a0: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
d1b0: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
d1c0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
d1d0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
d1e0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
d1f0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
d200: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
d210: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
d220: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
d230: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
d240: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
d250: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
d260: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d270: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
d280: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
d290: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
d2a0: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
d2b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
d2c0: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
d2d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d2e0: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
d2f0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
d300: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
d310: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d320: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d330: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
d350: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
d360: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
d370: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
d380: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
d390: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
d3a0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
d3b0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
d3c0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
d3d0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
d3e0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
d3f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d400: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
d410: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
d420: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
d430: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
d440: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
d450: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
d460: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
d470: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
d480: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
d490: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
d4a0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
d4b0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
d4c0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
d4d0: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
d4e0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
d4f0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
d500: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
d510: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
d520: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
d530: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
d540: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
d550: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
d560: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
d570: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
d580: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
d590: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
d5a0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
d5b0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
d5c0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
d5d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
d5e0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
d5f0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
d600: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
d610: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
d620: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d630: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d640: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d650: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d660: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d670: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
d680: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d690: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d6a0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
d6b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d6c0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
d6d0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
d6e0: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
d6f0: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
d700: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
d710: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
d720: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
d730: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
d740: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
d750: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
d760: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
d770: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
d780: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
d790: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
d7a0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
d7b0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
d7c0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
d7d0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d7e0: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
d7f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d800: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d810: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d820: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d830: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d840: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d850: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
d860: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d870: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
d880: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
d890: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d8a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
d8c0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
d8d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d8e0: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
d8f0: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
d900: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
d910: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
d920: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
d930: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
d940: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
d950: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
d960: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
d970: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
d980: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
d990: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
d9a0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
d9b0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
d9c0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
d9d0: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
d9e0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
d9f0: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
da00: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
da10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
da20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
da30: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
da40: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
da50: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
da60: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
da70: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
da80: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
da90: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
daa0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
dab0: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
dac0: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
dad0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
dae0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
daf0: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
db00: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
db10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
db20: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
db30: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
db40: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
db50: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
db60: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
db70: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
db80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
db90: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
dba0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
dbb0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
dbc0: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
dbd0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
dbe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
dbf0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
dc00: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
dc10: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
dc20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
dc30: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
dc40: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
dc50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
dc60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dc70: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
dc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dc90: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
dca0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
dcb0: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
dcc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dcd0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
dce0: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
dcf0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
dd00: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
dd10: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
dd20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
dd30: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
dd40: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
dd50: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
dd80: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
dd90: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
dda0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ddb0: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ddc0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ddd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dde0: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ddf0: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
de00: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
de10: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
de20: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
de30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
de40: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
de50: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
de60: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
de70: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
de80: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
de90: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
dea0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
deb0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
dec0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
ded0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
dee0: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
def0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
df00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
df10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
df20: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
df30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
df40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
df50: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
df60: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
df70: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
df80: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
df90: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
dfa0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
dfb0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
dfc0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
dfd0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
dfe0: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
dff0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
e000: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e010: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e020: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e030: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e040: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
e050: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
e060: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
e070: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
e080: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
e090: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
e0a0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e0b0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
e0c0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
e0d0: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
e0e0: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
e0f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e100: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
e110: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
e120: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
e130: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
e140: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
e150: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
e160: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
e170: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
e180: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
e190: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
e1a0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
e1b0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
e1c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
e1d0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e1e0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e1f0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e200: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e210: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e220: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
e230: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
e240: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
e250: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
e260: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
e270: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
e280: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
e290: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
e2a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
e2b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e2c0: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
e2d0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
e2e0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
e2f0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
e300: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
e310: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
e320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e330: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e340: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
e350: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
e360: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
e370: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
e380: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
e390: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e3a0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
e3b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e3d0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e3e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
e3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
e400: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e410: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
e420: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e430: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e440: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
e450: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
e460: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e470: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
e480: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e490: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
e4a0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
e4b0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
e4c0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
e4d0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
e4e0: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
e4f0: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
e500: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e510: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
e520: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
e530: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
e540: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
e550: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
e560: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
e570: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
e580: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
e590: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
e5a0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e5c0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e5d0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
e5e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e5f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e610: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
e620: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
e630: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
e640: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
e650: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
e660: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
e670: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
e680: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
e690: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
e6a0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
e6b0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
e6c0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
e6d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e6e0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
e6f0: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
e700: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
e710: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
e720: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
e730: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e740: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
e750: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
e760: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
e770: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
e780: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
e790: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
e7a0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
e7b0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
e7c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
e7d0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
e7e0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e7f0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
e800: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
e810: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
e820: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e840: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e850: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
e860: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e870: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e880: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e890: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e8a0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e8b0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
e8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e8d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e8e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e8f0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e900: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
e910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e920: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e930: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e940: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e950: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
e960: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
e970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e980: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
e990: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
e9a0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
e9b0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
e9c0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
e9d0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
e9e0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
e9f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ea00: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
ea10: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ea20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
ea30: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
ea40: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
ea50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
ea60: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
ea70: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
ea80: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
ea90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
eaa0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
eab0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
eac0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ead0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
eae0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
eaf0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
eb00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
eb10: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
eb20: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
eb30: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
eb40: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
eb50: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
eb60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
eb70: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
eb80: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
eb90: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
eba0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
ebb0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
ebc0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
ebd0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
ebe0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
ebf0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
ec00: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
ec10: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
ec20: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
ec30: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
ec40: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
ec50: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
ec60: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
ec70: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
ec80: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
ec90: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
eca0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ecb0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
ecc0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
ecd0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
ece0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
ecf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ed00: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
ed10: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
ed20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ed30: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
ed40: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
ed50: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ed60: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
ed70: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
ed80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
ed90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
eda0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
edb0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
edc0: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
edd0: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
ede0: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
edf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
ee00: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
ee10: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
ee20: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
ee30: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
ee40: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
ee50: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
ee60: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
ee70: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
ee80: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
ee90: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
eea0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
eeb0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
eec0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
eed0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
eee0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
eef0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
ef00: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
ef10: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
ef20: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
ef30: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
ef40: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
ef50: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20  nWrite = 0;.  p 
ef60: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
ef70: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
ef80: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
ef90: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
efa0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
efb0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
efc0: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
efd0: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
efe0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
eff0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
f000: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
f010: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61  veVdbeCnt );.  a
f020: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
f030: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
f040: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
f050: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
f060: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
f070: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ./*.** For every
f080: 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64   Btree that in d
f090: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f0a0: 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20  on db which .** 
f0b0: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
f0c0: 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76  d, "trip" or inv
f0d0: 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72  alidate each cur
f0e0: 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42  sor in.** that B
f0f0: 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20  tree might have 
f100: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
f110: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
f120: 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65  .** can never be
f130: 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68   used again.  Th
f140: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
f150: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f  a rollback.*** o
f160: 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20  ccurs.  We have 
f170: 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20  to trip all the 
f180: 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65  other cursors, e
f190: 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72  ven.** cursor fr
f1a0: 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20  om other VMs in 
f1b0: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
f1c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a  se connections,.
f1d0: 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20  ** so that none 
f1e0: 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75  of them try to u
f1f0: 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77  se the data at w
f200: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72  hich they.** wer
f210: 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77  e pointing and w
f220: 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76  hich now may hav
f230: 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64  e been changed d
f240: 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c  ue.** to the rol
f250: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  lback..**.** Rem
f260: 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c  ember that a rol
f270: 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65  lback can delete
f280: 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65   tables complete
f290: 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20   and.** reorder 
f2a0: 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69  rootpages.  So i
f2b0: 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
f2c0: 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65  ent just to save
f2d0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66  .** the state of
f2e0: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65   the cursor.  We
f2f0: 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64   have to invalid
f300: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ate the cursor.*
f310: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  * so that it is 
f320: 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e  never used again
f330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f340: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
f350: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
f360: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
f370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
f380: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f390: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
f3a0: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
f3b0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
f3c0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
f3d0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
f3e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f3f0: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
f400: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
f410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f420: 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
f430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f440: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
f450: 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
f460: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
f470: 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
f480: 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
f490: 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
f4a0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
f4b0: 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
f4c0: 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
f4d0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f4e0: 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
f4f0: 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
f500: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
f510: 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
f520: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f530: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
f540: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f550: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64  tion is commtted
f560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
f570: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
f580: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
f590: 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
f5a0: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
f5b0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
f5c0: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
f5d0: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
f5e0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
f5f0: 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
f600: 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
f610: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
f620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
f630: 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
f640: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
f650: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
f660: 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
f670: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
f680: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
f690: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
f6a0: 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
f6b0: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
f6c0: 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
f6d0: 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
f6e0: 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  ured, causing an
f6f0: 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
f700: 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
f710: 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
f720: 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
f730: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
f740: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
f750: 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
f760: 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
f770: 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
f780: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
f790: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
f7a0: 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
f7b0: 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
f7c0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f7d0: 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
f7e0: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
f7f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
f800: 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
f810: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
f820: 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
f830: 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
f840: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
f850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
f860: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f870: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
f880: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
f890: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f8a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f8b0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f8c0: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f8d0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f8e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
f8f0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
f900: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
f910: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f920: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f940: 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
f950: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f960: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f970: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f980: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f990: 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
f9a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f9c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f9d0: 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
f9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f9f0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
fa00: 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
fa10: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
fa20: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
fa30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fa40: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
fa50: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
fa60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
fa70: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
fa80: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
fa90: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
faa0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
fab0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
fac0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fad0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
fae0: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
faf0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
fb00: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
fb10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fb20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
fb30: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
fb40: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
fb50: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
fb60: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
fb70: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
fb80: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
fb90: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
fba0: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
fbb0: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
fbc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
fbd0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
fbe0: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
fbf0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
fc00: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
fc10: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
fc20: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
fc30: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  efCons;.    }.  
fc40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
fc60: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
fc70: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
fc80: 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
fc90: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
fca0: 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
fcb0: 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
fcc0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
fcd0: 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
fce0: 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
fcf0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
fd00: 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
fd10: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
fd20: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
fd30: 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
fd40: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
fd50: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
fd60: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
fd70: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
fd80: 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
fd90: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
fda0: 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
fdb0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
fdc0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
fdd0: 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
fde0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72  ONSTRAINT and wr
fdf0: 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ite.** an error 
fe00: 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
fe10: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
fe20: 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
fe30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe40: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
fe50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
fe60: 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
fe70: 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
fe80: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
fe90: 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
fea0: 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  d && db->nDeferr
feb0: 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64  edCons>0) || (!d
fec0: 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
fed0: 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29  kConstraint>0) )
fee0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
fef0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
ff00: 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
ff10: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
ff30: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
ff40: 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  , db, "foreign k
ff50: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
ff60: 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
ff70: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ff80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
ff90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
ffa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
ffb0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ffc0: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
ffd0: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
ffe0: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
fff0: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
10000 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
10010 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
10020 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
10030 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
10040 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
10050 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
10060 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
10070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
10080 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
10090 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
100a0 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
100b0 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
100c0 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
100d0 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
100e0 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
100f0 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
10100 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
10110 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
10120 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
10130 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
10140 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
10150 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
10160 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
10170 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
10180 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10190 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
101a0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
101b0 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
101c0 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
101d0 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
101e0 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
101f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10200 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
10210 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
10240 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
10250 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
10260 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10270 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
10280 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
10290 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
102a0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
102b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
102c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
102d0 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
102e0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
102f0 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
10300 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
10310 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
10320 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
10330 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
10340 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10350 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
10360 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
10370 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
10380 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
10390 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
103a0 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
103b0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
103c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
103d0 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
103e0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
103f0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
10400 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
10410 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
10420 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
10430 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10440 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
10450 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
10460 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
10470 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
10480 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
10490 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
104a0 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
104b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
104c0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
104d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
104e0 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  f( p->aOnceFlag 
104f0 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63  ) memset(p->aOnc
10500 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e  eFlag, 0, p->nOn
10510 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65  ceFlag);.  close
10520 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
10530 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
10540 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
10550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10560 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
10570 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10580 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
10590 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
105a0 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
105b0 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
105c0 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
105d0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
105e0 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
105f0 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
10600 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
10610 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
10620 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
10630 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
10640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
10650 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
10660 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
10670 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
10680 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
10690 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
106a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
106b0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
106c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
106d0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
106e0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
106f0 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
10700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10710 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
10720 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
10730 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
10740 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
10750 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
10760 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
10770 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
10780 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
107b0 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
107c0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
107d0 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
107e0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
107f0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
10800 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
10810 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
10820 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
10830 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
10840 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
10850 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
10860 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
10870 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
10880 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
10890 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
108a0 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
108b0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
108c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
108d0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
108e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
108f0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
10900 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
10910 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
10920 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
10930 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
10940 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
10950 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
10960 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
10970 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
10980 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
10990 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
109a0 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
109b0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
109c0 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
109d0 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
109e0 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
109f0 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
10a00 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
10a10 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
10a20 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
10a30 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
10a40 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
10a50 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
10a60 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
10a70 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
10a80 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
10a90 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
10aa0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
10ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
10ac0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
10ad0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
10ae0 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
10af0 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
10b00 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
10b10 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
10b20 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
10b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b40 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
10b50 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
10b60 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
10b70 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
10b80 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
10b90 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
10ba0 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
10bb0 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
10bc0 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
10bd0 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
10be0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
10bf0 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
10c00 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
10c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
10c20 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10c30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
10c40 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
10c50 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
10c60 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
10c70 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
10c80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10c90 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
10ca0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
10cb0 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
10cc0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
10cd0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10ce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10cf0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
10d00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
10d10 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
10d20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
10d30 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
10d40 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
10d50 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
10d60 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
10d70 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
10d80 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
10d90 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
10da0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
10db0 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
10dc0 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
10dd0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
10de0 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
10df0 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
10e00 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
10e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10e20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
10e30 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
10e40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
10e50 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
10e60 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
10e70 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
10e80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10ea0 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
10eb0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
10ec0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
10ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10ee0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10ef0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
10f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
10f20 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
10f30 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
10f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10f50 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
10f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10f70 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
10f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
10fa0 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
10fb0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
10fc0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
10fd0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
10fe0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
10ff0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
11000 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
11010 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
11020 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
11030 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
11040 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
11050 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
11060 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
11070 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
11080 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
11090 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
110a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
110b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
110c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
110d0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
110e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
110f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11100 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
11110 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11120 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11130 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
11140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11150 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
11160 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
11170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11180 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
11190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
111a0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
111b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
111c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
111d0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
111e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
111f0 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
11200 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
11210 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11220 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
11230 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
11240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11250 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
11260 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
11270 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
11280 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
11290 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
112a0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
112b0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
112c0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
112d0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
112e0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
112f0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
11300 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
11310 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
11320 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
11330 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
11340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11350 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
11360 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
11370 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
11380 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11390 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
113a0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
113b0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
113c0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
113d0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
113e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
113f0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
11400 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
11410 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
11420 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
11430 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
11440 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
11450 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
11460 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
11470 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
11480 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
11490 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
114a0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
114b0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
114c0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
114d0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
114e0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
114f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
11500 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
11510 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
11520 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
11530 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
11540 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11550 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
11560 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
11570 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
11580 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
11590 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
115a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
115b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
115c0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
115d0 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
115e0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
115f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11600 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
11610 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
11620 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11640 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
11650 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
11660 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
11670 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11680 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
11690 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
116a0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
116b0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
116c0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
116d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
116e0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
116f0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
11700 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
11710 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11720 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
11730 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
11740 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
11750 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11760 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
11770 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
11780 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
11790 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
117a0 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
117b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
117c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
117d0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
117e0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
117f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11810 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
11820 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11830 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
11840 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
11850 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
11860 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
11870 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11880 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
11890 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
118a0 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
118b0 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
118c0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
118d0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
118e0 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
118f0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  beCnt--;.    if(
11900 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b   !p->readOnly ){
11910 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65  .      db->write
11920 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d  VdbeCnt--;.    }
11930 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11940 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d  >activeVdbeCnt>=
11950 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
11960 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
11970 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
11980 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
11990 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
119a0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
119b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
119c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
119d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
119e0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
119f0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
11a00 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
11a10 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
11a20 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
11a30 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
11a40 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
11a50 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
11a60 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11a70 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
11a80 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
11a90 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
11aa0 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
11ab0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
11ac0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
11ad0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11ae0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
11af0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
11b00 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c  ctiveVdbeCnt>0 |
11b10 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
11b20 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
11b30 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
11b40 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
11b50 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
11b60 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
11b70 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
11b80 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
11b90 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
11ba0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
11bb0 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
11bc0 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
11bd0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
11be0 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
11bf0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
11c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11c10 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
11c20 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
11c30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
11c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
11c50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  the error code a
11c60 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
11c70 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
11c80 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a  e VDBE passed.**
11c90 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
11ca0 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61  gument to its da
11cb0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73  tabase handle (s
11cc0 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
11cd0 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   be .** returned
11ce0 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
11cf0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61  ite3_errcode() a
11d00 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nd sqlite3_errms
11d10 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  g())..**.** This
11d20 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
11d30 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42  ot clear the VDB
11d40 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20  E error code or 
11d50 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a  message, just.**
11d60 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20   copies them to 
11d70 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11d80 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
11d90 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
11da0 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  rror(Vdbe *p){. 
11db0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11dc0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
11dd0 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d   p->rc;.  if( p-
11de0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
11df0 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  u8 mallocFailed 
11e00 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
11e10 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ed;.    sqlite3B
11e20 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11e30 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ();.    sqlite3V
11e40 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
11e50 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
11e60 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
11e70 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
11e80 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
11e90 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
11ea0 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  );.    db->mallo
11eb0 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
11ec0 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e  Failed;.    db->
11ed0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
11ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11ef0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
11f00 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
11f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
11f20 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
11f30 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
11f40 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
11f50 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
11f60 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
11f70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11f80 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
11f90 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
11fa0 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
11fb0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
11fc0 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
11fd0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
11fe0 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
11ff0 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
12000 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
12010 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
12020 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
12030 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
12040 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
12050 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
12060 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
12070 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
12080 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
12090 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
120a0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
120b0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
120c0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
120d0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
120e0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
120f0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
12100 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
12110 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
12120 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
12130 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
12140 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
12150 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
12160 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
12170 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
12180 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
12190 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
121a0 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
121b0 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
121c0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
121d0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
121e0 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
121f0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
12200 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
12210 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
12220 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
12230 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
12240 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
12250 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
12260 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
12270 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
12280 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12290 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
122a0 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
122b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
122c0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
122d0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
122e0 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
122f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12300 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
12310 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
12320 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
12330 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
12340 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
12350 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
12360 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
12370 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
12380 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
12390 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
123a0 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
123b0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
123c0 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
123d0 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
123e0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
123f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
12400 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
12410 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
12420 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
12430 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
12440 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
12450 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12460 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
12470 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
12480 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
12490 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
124a0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
124b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
124c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
124d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
124e0 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
124f0 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
12500 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
12510 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
12520 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
12530 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
12540 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
12550 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
12560 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
12570 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
12580 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
12590 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
125a0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
125b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
125c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
125d0 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
125e0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
125f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12600 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
12610 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
12620 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
12630 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12640 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
12650 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12660 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
12670 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
12680 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
12690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
126a0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
126b0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
126c0 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
126d0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
126e0 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
126f0 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
12700 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
12710 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
12720 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
12730 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
12740 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
12750 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
12760 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12770 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12780 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
12790 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
127a0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
127b0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
127c0 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
127d0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
127e0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
127f0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
12800 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
12810 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
12820 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
12830 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
12840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12850 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
12860 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
12870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12880 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
12890 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
128a0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
128b0 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
128c0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
128d0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
128e0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
128f0 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
12900 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
12910 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
12920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12930 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
12940 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
12950 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
12960 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
12970 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
12980 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
12990 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
129a0 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
129b0 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
129c0 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
129d0 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
129e0 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
129f0 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
12a00 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
12a10 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
12a20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12a30 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
12a40 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
12a50 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
12a60 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12a70 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
12a80 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
12a90 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
12aa0 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
12ab0 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
12ac0 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
12ad0 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20  (((u32)1)<<i))) 
12ae0 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
12af0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
12b00 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
12b10 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
12b20 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
12b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
12b40 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
12b50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12b60 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
12b70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12b80 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12b90 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12ba0 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  gument..** The d
12bb0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
12bc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12bd0 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
12be0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
12bf0 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
12c00 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
12c10 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
12c20 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
12c30 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
12c40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12c50 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
12c60 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12c70 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
12c80 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
12c90 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
12ca0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
12cb0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
12cc0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
12cd0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
12ce0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
12cf0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
12d00 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
12d10 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
12d20 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
12d30 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
12d40 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
12d50 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
12d60 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
12d70 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
12d80 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12d90 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
12da0 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
12db0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
12dc0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
12dd0 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
12de0 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
12df0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
12e00 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
12e10 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
12e20 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
12e30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12e40 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
12e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12e60 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
12e70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12e80 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
12e90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12ea0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
12eb0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12ec0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
12ed0 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62  AIN).  sqlite3Db
12ee0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70  Free(db, p->zExp
12ef0 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  lain);.  sqlite3
12f00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45  DbFree(db, p->pE
12f10 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a  xplain);.#endif.
12f20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12f30 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
12f40 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
12f50 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
12f60 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12f70 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
12f80 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
12f90 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
12fa0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
12fb0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ->db;.  if( p->p
12fc0 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
12fd0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
12fe0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
12ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
13000 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
13010 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
13020 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
13030 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
13040 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13050 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
13060 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
13070 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
13080 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
13090 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f  lite3VdbeDeleteO
130a0 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a  bject(db, p);.}.
130b0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
130c0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
130d0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
130e0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
130f0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
13100 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
13110 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
13120 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
13130 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
13140 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
13150 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
13160 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
13170 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
13180 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
13190 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
131a0 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
131b0 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
131c0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
131d0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
131e0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
131f0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
13200 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
13210 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
13220 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
13230 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
13240 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
13250 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
13260 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
13270 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
13280 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
13290 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
132a0 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
132b0 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
132c0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
132d0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
132e0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
132f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13300 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
13310 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
13320 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
13330 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
13340 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
13350 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
13360 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
13370 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
13380 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
13390 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
133a0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
133b0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
133c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
133d0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
133e0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
133f0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
13400 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
13410 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13420 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
13430 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  id = p->movetoTa
13440 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65  rget;.    if( re
13450 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
13460 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13470 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  T;.    p->rowidI
13480 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64  sValid = 1;.#ifd
13490 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
134a0 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
134b0 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
134c0 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
134d0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
134e0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
134f0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
13500 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
13510 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
13520 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
13530 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
13540 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
13550 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
13560 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
13570 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
13580 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
13590 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
135a0 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
135b0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
135c0 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
135d0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
135e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
135f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13600 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
13610 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
13620 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13630 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
13640 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
13650 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
13660 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
13670 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13680 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
13690 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
136a0 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
136b0 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
136c0 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
136d0 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
136e0 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
136f0 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
13700 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
13710 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
13720 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
13730 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
13740 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
13750 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
13760 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
13770 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
13780 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
13790 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
137a0 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
137b0 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
137c0 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
137d0 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
137e0 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
137f0 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
13800 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
13810 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
13820 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
13830 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
13840 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13850 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
13860 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
13870 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
13880 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
13890 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
138a0 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
138b0 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
138c0 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
138d0 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
138e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
138f0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
13900 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
13910 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
13920 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
13930 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
13940 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
13950 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
13970 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13980 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
13990 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
139c0 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
139f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13a00 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
13a20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13a30 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13a40 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
13a50 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
13a60 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13a70 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
13aa0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13ab0 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
13ac0 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
13ad0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13ae0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
13b10 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13b20 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
13b40 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
13b50 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13b80 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
13b90 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13bc0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
13bd0 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13c00 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
13c10 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
13c20 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
13c30 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
13c40 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
13c50 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
13c60 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
13c70 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
13c80 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
13c90 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
13ca0 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
13cb0 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
13cc0 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
13cd0 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
13ce0 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
13cf0 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
13d00 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
13d10 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
13d20 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
13d30 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
13d40 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13d50 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
13d60 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
13d70 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
13d80 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
13d90 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
13da0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
13db0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
13dc0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
13dd0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
13de0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
13df0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
13e00 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
13e10 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
13e20 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
13e30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
13e40 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
13e50 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
13e60 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
13e70 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
13e80 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
13e90 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
13ea0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
13eb0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
13ec0 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20  <(-MAX_6BYTE) ) 
13ed0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20  return 6;.      
13ee0 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74  /* Previous test
13ef0 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20   prevents:  u = 
13f00 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  -(-9223372036854
13f10 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20  775808) */.     
13f20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c   u = -i;.    }el
13f30 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
13f40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
13f50 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
13f60 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
13f70 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
13f80 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
13f90 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
13fa0 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
13fb0 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
13fc0 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
13fd0 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
13fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
13ff0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
14000 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
14010 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
14020 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
14030 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
14040 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
14050 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
14060 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
14070 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
14080 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
14090 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
140a0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
140b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
140c0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
140d0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
140e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
140f0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
14100 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
14110 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
14120 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
14130 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
14140 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14150 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
14160 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
14170 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
14180 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
14190 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
141a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
141b0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
141c0 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
141d0 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
141e0 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
141f0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
14200 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
14210 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
14220 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
14230 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
14240 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
14250 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
14260 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
14270 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
14280 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
14290 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
142a0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
142b0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
142c0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
142d0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
142e0 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
142f0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
14300 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
14310 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
14320 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
14330 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
14340 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
14350 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
14360 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
14370 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
14380 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
14390 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
143a0 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
143b0 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
143c0 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
143d0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
143e0 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
143f0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
14400 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
14410 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
14420 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
14430 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
14440 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
14450 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
14460 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
14470 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
14480 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
14490 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
144a0 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
144b0 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
144c0 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
144d0 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
144e0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
144f0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
14500 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
14510 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
14520 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
14530 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
14540 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
14550 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
14560 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
14570 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
14580 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
14590 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
145a0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
145b0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
145c0 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
145d0 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
145e0 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
145f0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
14600 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
14610 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
14620 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
14630 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
14640 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
14650 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
14660 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
14670 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
14680 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
14690 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
146a0 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
146b0 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
146c0 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
146d0 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
146e0 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
146f0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
14700 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
14710 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
14720 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
14730 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
14740 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
14750 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
14760 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
14770 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
14780 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
14790 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
147a0 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
147b0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
147c0 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
147d0 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
147e0 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
147f0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
14800 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
14810 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
14820 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
14830 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
14840 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
14850 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
14860 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
14870 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
14880 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
14890 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
148a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
148b0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
148c0 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
148d0 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
148e0 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
148f0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
14900 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
14910 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
14920 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
14930 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
14940 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
14950 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
14960 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
14970 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
14980 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
14990 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
149a0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
149b0 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
149c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
149d0 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
149e0 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
149f0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
14a00 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
14a10 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
14a20 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
14a30 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
14a40 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
14a50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
14a60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14a70 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
14a80 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
14a90 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
14aa0 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
14ab0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
14ac0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
14ad0 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
14ae0 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
14af0 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
14b00 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
14b10 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
14b20 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
14b30 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
14b40 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
14b50 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
14b60 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
14b70 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
14b80 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
14b90 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
14ba0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
14bb0 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
14bc0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
14bd0 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
14be0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
14bf0 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
14c00 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
14c10 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
14c20 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
14c30 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
14c40 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
14c50 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
14c60 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
14c70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14c80 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
14c90 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
14ca0 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
14cb0 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
14cc0 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
14cd0 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
14ce0 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
14cf0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
14d00 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
14d10 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
14d20 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
14d30 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14d40 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
14d50 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
14d60 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
14d70 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
14d80 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
14d90 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
14da0 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
14db0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
14dc0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
14dd0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
14de0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
14df0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
14e00 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
14e10 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
14e20 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
14e30 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14e40 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
14e50 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
14e60 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
14e70 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
14e80 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
14e90 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
14ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14eb0 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
14ec0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
14ed0 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
14ee0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
14ef0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
14f00 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
14f10 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
14f20 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
14f30 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
14f40 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
14f50 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
14f60 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14f70 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
14f80 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
14f90 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
14fa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
14fb0 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
14fc0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
14fd0 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
14fe0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
14ff0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
15000 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
15010 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
15020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
15030 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
15040 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
15050 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
15060 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
15070 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
15080 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
15090 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
150a0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
150b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
150c0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
150d0 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
150e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
150f0 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
15100 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
15110 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
15120 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
15130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15140 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
15150 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
15160 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
15170 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15180 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
15190 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
151a0 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
151b0 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
151c0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
151d0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
151e0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
151f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
15200 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
15210 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
15220 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
15230 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15240 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
15250 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
15260 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
15270 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
15280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15290 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
152a0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
152b0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152d0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
152e0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
152f0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
15300 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
15310 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
15320 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
15330 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
15340 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
15350 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
15360 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
15370 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
15380 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
15390 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
153a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
153b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
153c0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
153d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
153e0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
153f0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
15400 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
15410 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15420 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
15430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15440 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
15450 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15460 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15470 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
15480 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
15490 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
154a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
154b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
154c0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
154d0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
154e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
154f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
15500 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
15510 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
15520 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
15530 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
15540 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15550 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15560 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
15570 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
15580 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
15590 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
155a0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
155b0 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
155c0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
155d0 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
155e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
155f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15600 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
15610 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
15620 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
15630 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15640 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
15650 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
15660 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
15670 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
15680 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
15690 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
156a0 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
156b0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
156c0 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
156d0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
156e0 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
156f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
15710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15720 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
15730 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15740 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
15750 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
15760 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
15770 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
15780 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
15790 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
157a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
157b0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
157c0 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
157d0 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
157e0 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
157f0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
15800 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
15810 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
15820 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
15830 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
15840 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
15850 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
15860 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
15870 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
15880 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
15890 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
158a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
158b0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
158c0 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
158d0 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
158e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
158f0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
15900 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
15910 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
15920 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
15930 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15940 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
15950 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
15960 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
15970 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
15980 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
15990 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
159a0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
159b0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
159c0 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
159d0 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
159e0 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
159f0 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
15a00 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
15a10 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
15a20 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
15a30 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
15a40 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
15a50 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
15a60 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15a70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
15a80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15a90 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
15aa0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
15ab0 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
15ac0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
15ad0 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
15ae0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
15af0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
15b00 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15b10 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
15b20 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
15b30 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
15b40 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15b50 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
15b60 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
15b70 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
15b80 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
15b90 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
15ba0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15bb0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
15bc0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15bd0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15be0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15bf0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
15c00 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
15c10 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
15c20 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
15c30 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
15c40 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
15c50 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
15c60 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
15c70 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
15c80 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
15c90 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15ca0 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
15cb0 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
15cc0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
15cd0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
15ce0 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
15cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
15d00 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
15d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
15d20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15d30 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
15d40 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
15d50 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
15d60 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
15d70 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
15d80 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
15d90 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
15da0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
15db0 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
15dc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
15dd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
15de0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
15df0 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
15e00 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
15e10 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
15e20 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
15e30 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
15e40 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
15e50 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
15e60 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
15e70 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
15e80 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
15e90 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
15ea0 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
15eb0 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
15ec0 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
15ed0 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
15ee0 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
15ef0 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
15f00 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
15f10 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
15f20 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
15f30 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
15f40 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
15f50 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
15f60 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
15f70 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
15f80 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
15f90 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
15fa0 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
15fb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
15fc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
15fd0 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
15fe0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
15ff0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16000 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
16010 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
16020 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
16030 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
16060 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
16070 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
160a0 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
160b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
160c0 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
160d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
160e0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
160f0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
16100 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
16110 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
16120 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
16130 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
16140 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
16150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16160 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
16170 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
16180 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
16190 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
161c0 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
161d0 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
161e0 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
161f0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
16200 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
16210 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
16220 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
16230 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
16240 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
16250 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
16260 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
16270 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
16280 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
16290 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
162a0 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
162b0 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
162c0 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
162d0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
162e0 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
162f0 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
16300 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
16310 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
16320 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
16330 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
16340 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
16350 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
16360 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
16370 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
16380 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
16390 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
163a0 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
163b0 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
163c0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
163d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
163e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
163f0 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
16400 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
16410 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
16420 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
16430 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
16440 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
16450 29 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66  )];.  p->pKeyInf
16460 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
16470 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
16480 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
16490 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
164a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
164b0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
164c0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
164d0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
164e0 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
164f0 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
16500 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
16510 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
16520 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
16530 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
16540 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
16550 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
16560 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
16570 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
16580 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
16590 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
165a0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
165b0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
165c0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
165d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
165e0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
165f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
16600 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
16610 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
16620 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
16630 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
16640 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
16650 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
16660 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
16670 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16680 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
16690 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
166a0 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
166b0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
166e0 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
166f0 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
16720 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
16730 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
16740 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
16750 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
16760 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73  flags = 0;.  ass
16770 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
16780 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
16790 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
167a0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
167b0 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
167c0 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
167d0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
167e0 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20   u<p->nField && 
167f0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
16800 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
16810 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
16820 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
16830 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
16840 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
16850 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
16860 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
16870 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
16880 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
16890 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
168a0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
168b0 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
168c0 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
168d0 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
168e0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a     pMem->z = 0;.
168f0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
16900 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16910 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
16920 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
16930 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
16940 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
16950 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
16960 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
16970 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a  Field = u;.}../*
16980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16990 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
169a0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
169b0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
169c0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
169d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
169e0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
169f0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
16a00 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
16a10 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
16a20 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16a30 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
16a40 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
16a50 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
16a60 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
16a70 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
16a80 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
16a90 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
16aa0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
16ab0 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
16ac0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
16ad0 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
16ae0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16af0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
16b00 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
16b10 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
16b20 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
16b30 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
16b40 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
16b50 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
16b60 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
16b70 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
16b80 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
16b90 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
16ba0 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
16bb0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16bc0 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
16bd0 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
16be0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
16bf0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
16c00 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
16c10 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
16c20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16c30 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
16c40 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
16c50 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
16c60 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
16c70 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
16c80 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
16c90 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
16ca0 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
16cb0 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
16cc0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
16cd0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16ce0 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
16cf0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
16d00 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
16d10 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
16d20 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
16d30 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
16d40 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   key */.){.  int
16d50 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
16d60 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16d70 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
16d80 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
16d90 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
16da0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
16db0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
16dc0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
16dd0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
16de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16df0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
16e00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
16e10 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
16e20 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
16e30 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
16e40 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
16e50 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16e60 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
16e70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16e80 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
16e90 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
16ea0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
16eb0 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
16ec0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
16ed0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
16ee0 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
16ef0 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
16f00 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
16f10 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
16f20 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
16f30 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
16f40 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
16f50 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
16f60 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16f70 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
16f80 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
16f90 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
16fa0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
16fb0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
16fc0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
16fd0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
16fe0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
16ff0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
17000 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
17010 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
17020 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
17030 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
17040 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
17050 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
17060 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
17070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
17080 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
17090 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
170a0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
170b0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
170c0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
170d0 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
170e0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
170f0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
17100 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
17110 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
17120 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
17130 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
17140 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
17150 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
17160 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
17170 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
17180 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
17190 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
171a0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
171b0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
171c0 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
171d0 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
171e0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
171f0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
17200 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
17210 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
17220 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
17230 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
17240 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
17250 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
17260 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
17270 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
17280 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
17290 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
172a0 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
172b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
172c0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
172d0 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
172e0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
172f0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
17300 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
17310 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
17320 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
17330 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
17340 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
17350 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
17360 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
17370 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17380 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
17390 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
173a0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
173d0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
173e0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
173f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
17400 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
17410 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
17420 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
17430 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
17440 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
17450 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
17460 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
17470 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17480 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
17490 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
174a0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
174b0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
174c0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
174d0 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
174e0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
174f0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
17500 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
17510 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
17520 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
17530 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
17540 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
17550 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
17560 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
17570 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
17580 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
17590 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
175a0 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
175b0 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
175c0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
175d0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
175e0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
175f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
17600 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17610 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
17620 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
17630 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
17640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17650 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
17660 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
17670 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
17680 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
17690 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
176a0 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
176b0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
176c0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
176d0 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
176e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
176f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17700 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
17710 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
17720 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
17730 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
17740 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
17750 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
17760 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
17770 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
17780 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
17790 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
177a0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
177b0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
177c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
177d0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
177e0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
177f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
17800 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
17810 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
17820 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
17830 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
17840 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
17850 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
17860 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
17870 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
17880 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
17890 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
178a0 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
178b0 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
178c0 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
178d0 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
178e0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
178f0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
17900 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
17910 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
17920 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
17930 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
17940 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
17950 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
17960 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
17970 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
17980 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
17990 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
179a0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
179b0 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
179c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
179d0 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
179e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
179f0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
17a00 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
17a10 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
17a20 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17a30 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
17a40 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
17a50 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
17a60 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
17a70 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
17a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a90 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
17aa0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
17ab0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
17ac0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
17ad0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
17ae0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
17af0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
17b00 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
17b10 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
17b20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
17b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17b40 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17b50 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17b60 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
17b70 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
17b80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
17b90 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
17ba0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17bb0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17bc0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
17bd0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
17be0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
17bf0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
17c00 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
17c10 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
17c20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
17c30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17c40 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17c50 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17c60 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
17c70 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
17c80 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
17c90 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
17ca0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
17cb0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17cc0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
17cd0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
17ce0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
17cf0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
17d00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17d10 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
17d20 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
17d30 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17d40 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17d50 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
17d60 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
17d70 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
17d80 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
17d90 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
17da0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
17db0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17dc0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
17dd0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
17de0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
17df0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
17e00 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
17e10 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
17e20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
17e30 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17e40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17e50 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17e60 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
17e70 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
17e80 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
17e90 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
17ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17eb0 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
17ec0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
17ed0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
17ee0 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
17ef0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
17f00 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
17f10 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
17f20 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
17f30 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
17f40 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
17f50 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ntry */.  memset
17f60 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
17f70 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
17f80 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
17f90 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ee(pCur, 0, (int
17fa0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
17fb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17fd0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
17fe0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
17ff0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
18000 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
18010 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
18020 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
18030 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
18040 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
18050 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
18060 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
18070 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
18080 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
18090 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
180a0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
180b0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
180c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
180d0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
180e0 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
180f0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
18100 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
18110 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
18120 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
18130 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
18140 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
18150 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
18160 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
18170 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
18180 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
18190 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
181a0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
181b0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
181c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
181d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
181e0 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
181f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
18200 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
18210 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
18220 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
18230 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
18240 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
18250 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
18260 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
18270 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
18280 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
18290 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
182a0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
182b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
182c0 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
182d0 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
182e0 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
182f0 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
18300 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
18310 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
18320 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
18330 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
18340 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
18350 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
18360 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
18370 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
18380 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
18390 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
183a0 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
183b0 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
183c0 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
183d0 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
183e0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
183f0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
18400 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
18410 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
18420 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
18430 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
18440 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
18450 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
18460 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
18470 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18480 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
18490 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
184a0 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
184b0 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  m.zMalloc!=0 );.
184c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
184d0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
184e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
184f0 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
18500 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
18510 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
18520 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
18530 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
18540 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
18550 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
18560 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
18570 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
18580 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
18590 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
185a0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
185b0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
185c0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
185d0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
185e0 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
185f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
18600 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
18610 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
18620 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
18630 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
18640 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
18650 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
18660 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
18670 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
18680 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18690 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
186a0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
186b0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
186c0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
186d0 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
186e0 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
186f0 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
18700 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
18710 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
18720 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
18730 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
18740 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
18750 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
18760 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
18770 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
18780 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
18790 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
187a0 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
187b0 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74  version of key t
187c0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
187d0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  t */.  int *res 
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18800 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
18810 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
18820 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
18830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
18840 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
18850 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
18860 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
18870 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18880 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
18890 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
188a0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
188b0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
188c0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
188d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
188e0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
188f0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
18900 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
18910 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
18920 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
18930 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
18940 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
18950 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 61  ecause of the sa
18960 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
18970 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
18980 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
18990 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
189a0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
189b0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
189c0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
189d0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
189e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
189f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18a00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  BKPT;.  }.  mems
18a10 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
18a20 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
18a30 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
18a40 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
18a50 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  , 0, (int)nCellK
18a60 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
18a70 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
18a80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
18a90 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e  ert( pUnpacked->
18aa0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
18ab0 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b  _PREFIX_MATCH );
18ac0 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
18ad0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
18ae0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
18af0 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
18b00 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
18b10 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
18b20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18b40 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
18b50 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
18b60 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
18b70 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
18b80 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
18b90 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18ba0 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
18bb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
18bc0 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
18bd0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
18be0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18c00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
18c10 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
18c20 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
18c30 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
18c40 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
18c50 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
18c60 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
18c70 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
18c80 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
18c90 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
18ca0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
18cb0 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
18cc0 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
18cd0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
18ce0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
18cf0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
18d00 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
18d10 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
18d20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18d30 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
18d40 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
18d50 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
18d60 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
18d70 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
18d80 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
18d90 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
18da0 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
18db0 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
18dc0 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
18dd0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
18de0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
18df0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
18e00 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
18e10 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
18e20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
18e30 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
18e40 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
18e50 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
18e60 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
18e70 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
18e80 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
18e90 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
18ea0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
18eb0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
18ec0 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
18ed0 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
18ee0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
18ef0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
18f00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
18f10 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
18f20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18f30 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
18f40 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
18f50 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
18f60 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
18f70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18f80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
18f90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
18fa0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
18fb0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
18fc0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
18fd0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
18fe0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
18ff0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
19000 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
19010 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
19020 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
19030 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
19040 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
19050 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
19060 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
19070 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
19080 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
19090 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
190a0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
190b0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
190c0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
190d0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
190e0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
190f0 64 62 65 47 65 74 56 61 6c 75 65 28 56 64 62 65  dbeGetValue(Vdbe
19100 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
19110 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
19120 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
19130 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
19140 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
19150 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28  iVar-1];.    if(
19160 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
19170 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
19180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
19190 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
191a0 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
191b0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
191c0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
191d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
191e0 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
191f0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
19200 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
19210 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
19220 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
19230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19240 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
19250 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20  (Mem *)pRet);.  
19260 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
19270 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
19280 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19290 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
192a0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
192b0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
192c0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
192d0 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
192e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
192f0 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
19300 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
19310 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
19320 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
19330 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
19340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
19350 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
19360 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
19370 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
19380 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
19390 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
193a0 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
193b0 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
193c0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
193d0 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
193e0 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65  ));.  }.}..#ifde
193f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19400 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a  PREUPDATE_HOOK..
19410 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  /*.** If the sec
19420 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19430 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73  not NULL, releas
19440 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  e any allocation
19450 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  s associated .**
19460 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79   with the memory
19470 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d   cells in the p-
19480 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41  >aMem[] array. A
19490 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70  lso free the Unp
194a0 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
194b0 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c  tructure itself,
194c0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
194d0 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Free()..**.** Th
194e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
194f0 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61  sed to free Unpa
19500 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
19510 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  tures allocated 
19520 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e  by.** the vdbeUn
19530 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e  packRecord() fun
19540 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76  ction found in v
19550 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61  dbeapi.c..*/.sta
19560 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
19570 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65  eUnpacked(sqlite
19580 33 20 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52  3 *db, UnpackedR
19590 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
195a0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
195b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
195c0 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  p->nField; i++){
195d0 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
195e0 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a   = &p->aMem[i];.
195f0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
19600 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
19610 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
19620 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
19630 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19640 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
19650 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70  .** Invoke the p
19660 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20  re-update hook. 
19670 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50  If this is an UP
19680 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70  DATE or DELETE p
19690 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a  re-update call,.
196a0 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70  ** then cursor p
196b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
196c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ond argument sho
196d0 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  uld point to the
196e0 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f   row about.** to
196f0 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65   be update or de
19700 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70  leted. If the ap
19710 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
19720 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
19730 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20  e_old(),.** the 
19740 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77  required value w
19750 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
19760 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
19770 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  sor points to..*
19780 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
19790 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
197a0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75     /* Vdbe pre-u
197d0 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e  pdate hook is in
197e0 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64  voked by */.  Vd
197f0 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  beCursor *pCsr, 
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19810 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20   Cursor to grab 
19820 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f  old.* values fro
19830 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  m */.  int op,  
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
19860 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20  _INSERT, UPDATE 
19870 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63  or DELETE */.  c
19880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
198a0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
198b0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
198c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
198d0 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64       /* Modified
198e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20   table */.  i64 
198f0 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20  iKey1,          
19900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19910 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65  nitial key value
19920 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
19950 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f  r for new.* reco
19960 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  rd */.){.  sqlit
19970 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a  e3 *db = v->db;.
19980 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50    i64 iKey2;.  P
19990 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61  reUpdate preupda
199a0 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
199b0 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a   *zTbl = pTab->z
199c0 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Name;..  assert(
199d0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
199e0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
199f0 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
19a00 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
19a10 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
19a20 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  TE_UPDATE ){.   
19a30 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
19a40 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65  [iReg].u.i;.  }e
19a50 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d  lse{.    iKey2 =
19a60 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61   iKey1;.  }..  a
19a70 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
19a80 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
19a90 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
19aa0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
19ab0 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
19ac0 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
19ad0 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
19ae0 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
19af0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
19b00 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
19b10 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
19b20 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
19b30 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
19b40 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
19b50 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
19b60 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
19b70 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
19b80 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
19b90 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
19ba0 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
19bb0 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a  .iKey1 = iKey1;.
19bc0 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
19bd0 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65  2 = iKey2;.  pre
19be0 75 70 64 61 74 65 2e 69 50 4b 65 79 20 3d 20 70  update.iPKey = p
19bf0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64  Tab->iPKey;..  d
19c00 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
19c10 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62  &preupdate;.  db
19c20 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
19c30 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64  back(db->pPreUpd
19c40 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20  ateArg, db, op, 
19c50 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31  zDb, zTbl, iKey1
19c60 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e  , iKey2);.  db->
19c70 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a  pPreUpdate = 0;.
19c80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19c90 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52  db, preupdate.aR
19ca0 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72  ecord);.  vdbeFr
19cb0 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
19cc0 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b  reupdate.pUnpack
19cd0 65 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  ed);.  vdbeFreeU
19ce0 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
19cf0 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b  pdate.pNewUnpack
19d00 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70  ed);.  if( preup
19d10 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20  date.aNew ){.   
19d20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
19d30 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69  i=0; i<pCsr->nFi
19d40 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
19d50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19d60 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74  elease(&preupdat
19d70 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  e.aNew[i]);.    
19d80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
19d90 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
19da0 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23  e.aNew);.  }.}.#
19db0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19dc0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
19dd0 5f 48 4f 4f 4b 20 2a 2f 0a                       _HOOK */.