/ Hex Artifact Content
Login

Artifact 0dcfffca621c534d8c64abfc47888dca5dd7b809:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65  _NOTUSED;.  p->e
0f60: 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  xpired = 0;.#ifd
0f70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0f80: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
0f90: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
0fa0: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0fb0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72   ) sqlite3VdbePr
0fc0: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
0fd0: 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a  aOp[i]);.#endif.
0fe0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
0ff0: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1000: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1010: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  t = 0;.#endif.  
1020: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20  return i;.}.int 
1030: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1040: 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  0(Vdbe *p, int o
1050: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1070: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  , op, 0, 0, 0);.
1080: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1090: 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c  eAddOp1(Vdbe *p,
10a0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29   int op, int p1)
10b0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
10c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
10d0: 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d  op, p1, 0, 0);.}
10e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10f0: 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20  AddOp2(Vdbe *p, 
1100: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
1110: 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72  int p2){.  retur
1120: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1130: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
1140: 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
1150: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1160: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1170: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70   p4 value as a p
1180: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
11c0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
11d0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
11e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11f0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1200: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1220: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1230: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1240: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1250: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1260: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1270: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1280: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1290: 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65   *zP4,    /* The
12a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
12b0: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
12c0: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
12d0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
12e0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
12f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1300: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1310: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1320: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1330: 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  zP4, p4type);.  
1340: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1350: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1360: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1370: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
1380: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
1390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13a0: 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62  AddOp4Int(.  Vdb
13b0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
13c0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
13d0: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
13e0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
13f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1400: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
1410: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
1420: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1430: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1450: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1460: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1470: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1480: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  3 operand */.  i
1490: 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20  nt p4           
14a0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
14b0: 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67  rand as an integ
14c0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
14d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14e0: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
14f0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71  1, p2, p3);.  sq
1500: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1510: 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54  4(p, addr, SQLIT
1520: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29  E_INT_TO_PTR(p4)
1530: 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72  , P4_INT32);.  r
1540: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1550: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1560: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
1570: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
1580: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
1590: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
15a0: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
15b0: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
15c0: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
15d0: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
15e0: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
15f0: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
1600: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
1610: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
1620: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
1630: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
1640: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
1650: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
1660: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
1670: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
1680: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
1690: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
16a0: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
16b0: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
16c0: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
16d0: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
16e0: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
16f0: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
1700: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
1710: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
1720: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
1730: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
1740: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
1750: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
1760: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
1770: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
1780: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
1790: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
17a0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
17b0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
17c0: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
17d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17e0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
17f0: 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c  t i;.  i = p->nL
1800: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
1810: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1820: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1830: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65   if( i>=p->nLabe
1840: 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  lAlloc ){.    in
1850: 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41  t n = p->nLabelA
1860: 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20  lloc*2 + 5;.    
1870: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1880: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1890: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
18a0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bel,.           
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69              n*si
18d0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
18e0: 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  ]));.    p->nLab
18f0: 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65  elAlloc = sqlite
1900: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
1910: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f  >db, p->aLabel)/
1920: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
1930: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [0]);.  }.  if( 
1940: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1950: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1960: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1970: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1980: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1990: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
19a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
19b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
19c0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
19d0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
19e0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
19f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1a00: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
1a10: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
1a20: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
1a30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1a40: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1a50: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1a60: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1a70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1a80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1a90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
1aa0: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
1ab0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
1ac0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1ad0: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
1ae0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1af0: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
1b00: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
1b10: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
1b20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b30: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
1b40: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
1b50: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
1b60: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1b70: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74  E_DEBUG /* sqlit
1b80: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
1b90: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a  () logic */../*.
1ba0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1bb0: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69   type and functi
1bc0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  on are used to i
1bd0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1be0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e  ll opcodes.** in
1bf0: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f   a Vdbe main pro
1c00: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66  gram and each of
1c10: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
1c20: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20  s (triggers) it 
1c30: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64  may .** invoke d
1c40: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
1c50: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64  ectly. It should
1c60: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c   be used as foll
1c70: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20  ows:.**.**   Op 
1c80: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f  *pOp;.**   VdbeO
1c90: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a  pIter sIter;.**.
1ca0: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74  **   memset(&sIt
1cb0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
1cc0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65  ter));.**   sIte
1cd0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20  r.v = v;        
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74      // v is of t
1d00: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20  ype Vdbe* .**   
1d10: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
1d20: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
1d30: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44  ) ){.**     // D
1d40: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
1d50: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20   pOp.**   }.**  
1d60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
1d70: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
1d80: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64  b);.** .*/.typed
1d90: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70  ef struct VdbeOp
1da0: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b  Iter VdbeOpIter;
1db0: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74  .struct VdbeOpIt
1dc0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  er {.  Vdbe *v; 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65    /* Vdbe to ite
1df0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1e00: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20   opcodes of */. 
1e10: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
1e20: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Sub;        /* A
1e30: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
1e40: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ams */.  int nSu
1e50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1e60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e70: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75   entries in apSu
1e80: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  b */.  int iAddr
1e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1eb0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1ec0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1ed0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20  int iSub;       
1ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1ef0: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  = main program, 
1f00: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72  1 = first sub-pr
1f10: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b  ogram etc. */.};
1f20: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74  .static Op *opIt
1f30: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65  erNext(VdbeOpIte
1f40: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76  r *p){.  Vdbe *v
1f50: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70   = p->v;.  Op *p
1f60: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61  Ret = 0;.  Op *a
1f70: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a  Op;.  int nOp;..
1f80: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70    if( p->iSub<=p
1f90: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69  ->nSub ){..    i
1fa0: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b  f( p->iSub==0 ){
1fb0: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e  .      aOp = v->
1fc0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
1fd0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c   v->nOp;.    }el
1fe0: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  se{.      aOp = 
1ff0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2000: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  -1]->aOp;.      
2010: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  nOp = p->apSub[p
2020: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a  ->iSub-1]->nOp;.
2030: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2040: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29  ( p->iAddr<nOp )
2050: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61  ;..    pRet = &a
2060: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20  Op[p->iAddr];.  
2070: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20    p->iAddr++;.  
2080: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d    if( p->iAddr==
2090: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  nOp ){.      p->
20a0: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d  iSub++;.      p-
20b0: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  >iAddr = 0;.    
20c0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65  }.  .    if( pRe
20d0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  t->p4type==P4_SU
20e0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
20f0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
2100: 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66  ->nSub+1)*sizeof
2110: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
2120: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2130: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
2140: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
2150: 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62      if( p->apSub
2160: 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50  [j]==pRet->p4.pP
2170: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
2180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2190: 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  ( j==p->nSub ){.
21a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
21b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
21c0: 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c  locOrFree(v->db,
21d0: 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65   p->apSub, nByte
21e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
21f0: 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20  p->apSub ){.    
2200: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
2210: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2220: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75           p->apSu
2230: 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70  b[p->nSub++] = p
2240: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2250: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2260: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2270: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
2280: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
2290: 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72  the program stor
22a0: 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73  ed in the VM ass
22b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61  ociated with pPa
22c0: 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  rse may.** throw
22d0: 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
22e0: 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65  ion (causing the
22f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
2300: 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73  not entire trans
2310: 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  action.** to be 
2320: 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68  rolled back). Th
2330: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
2340: 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  true if the main
2350: 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a   program or any.
2360: 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  ** sub-programs 
2370: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20  contains any of 
2380: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2390: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
23a0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
23b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
23c0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
23d0: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75    *  OP_HaltIfNu
23e0: 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  ll with P1=SQLIT
23f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
2400: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
2410: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
2420: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
2430: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
2440: 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f  Rename.**   *  O
2450: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68  P_FkCounter with
2460: 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74   P2==0 (immediat
2470: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2480: 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20  nstraint).**.** 
2490: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
24a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
24b0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
24c0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
24d0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
24e0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
24f0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
2500: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
2510: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
2520: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
2530: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
2540: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
2550: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
2560: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
2570: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
2580: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
2590: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
25a0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
25b0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
25c0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
25d0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
25e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
25f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
2600: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
2610: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
2620: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  bort = 0;.  Op *
2630: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
2640: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
2650: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2660: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
2670: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
2680: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2690: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
26a0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
26b0: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
26c0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
26d0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
26e0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
26f0: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
2700: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66  =OP_VRename .#if
2710: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2720: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
2730: 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50    || (opcode==OP
2740: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
2750: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
2760: 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a  >p2==1) .#endif.
2770: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
2780: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
2790: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
27a0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70  ll) .      && (p
27b0: 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43  Op->p1==SQLITE_C
27c0: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
27d0: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
27e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
27f0: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
2800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2810: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
2820: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
2830: 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65  apSub);..  /* Re
2840: 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73  turn true if has
2850: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e  Abort==mayAbort.
2860: 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20   Or if a malloc 
2870: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e  failure occured.
2880: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
2890: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
28a0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
28b0: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
28c0: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
28d0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
28e0: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
28f0: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
2900: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
2910: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
2920: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
2930: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
2940: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
2950: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
2960: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
2970: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
2980: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
2990: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
29a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
29b0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
29c0: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
29d0: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
29e0: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  on */../*.** Loo
29f0: 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72  p through the pr
2a00: 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ogram looking fo
2a10: 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74  r P2 values that
2a20: 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a   are negative.**
2a30: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
2a40: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63  tions.  Each suc
2a50: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
2a60: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
2a70: 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74  .** label by set
2a80: 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75  ting the P2 valu
2a90: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
2aa0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
2ab0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ac0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
2ad0: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
2ae0: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
2af0: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
2b00: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
2b10: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
2b20: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
2b30: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
2b40: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
2b50: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
2b60: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
2b70: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
2b80: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2ba0: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
2bb0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
2bc0: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
2bd0: 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65  e Op.opflags fie
2be0: 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c  ld is set on all
2bf0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61   opcodes..*/.sta
2c00: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
2c10: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
2c20: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
2c30: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
2c40: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
2c50: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
2c60: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20   Op *pOp;.  int 
2c70: 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61  *aLabel = p->aLa
2c80: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
2c90: 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f  ly = 1;.  for(pO
2ca0: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
2cb0: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
2cc0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
2cd0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
2ce0: 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e  code;..    pOp->
2cf0: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
2d00: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
2d10: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
2d20: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2d30: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2d40: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
2d50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
2d60: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2d70: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20  rgs = pOp->p5;. 
2d80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70     }else if( (op
2d90: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63  code==OP_Transac
2da0: 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21  tion && pOp->p2!
2db0: 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  =0) || opcode==O
2dc0: 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  P_Vacuum ){.    
2dd0: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
2de0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2df0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e00: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
2e10: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
2e20: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66  date ){.      if
2e30: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
2e40: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
2e50: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c  pOp->p2;.    }el
2e60: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
2e70: 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  P_VFilter ){.   
2e80: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
2e90: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
2ea0: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
2eb0: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
2ec0: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
2ed0: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  ger );.      n =
2ee0: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
2ef0: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
2f00: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
2f10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
2f20: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
2f30: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55  flags & OPFLG_JU
2f40: 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70  MP)!=0 && pOp->p
2f50: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  2<0 ){.      ass
2f60: 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c  ert( -1-pOp->p2<
2f70: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  p->nLabel );.   
2f80: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
2f90: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
2fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2fb0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
2fc0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
2fd0: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a  p->aLabel = 0;..
2fe0: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
2ff0: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f  = nMaxArgs;.}../
3000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3010: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
3020: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
3030: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
3040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3050: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
3060: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
3070: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
3080: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3090: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
30a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
30c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30d0: 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73  array of opcodes
30e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30f0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73  .** the Vdbe pas
3100: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3110: 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73   argument. It is
3120: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
3130: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
3140: 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68  o arrange for th
3150: 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79  e returned array
3160: 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c   to be eventuall
3170: 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68  y freed using th
3180: 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70  e .** vdbeFreeOp
3190: 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e  Array() function
31a0: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
31b0: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20  eturning, *pnOp 
31c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
31d0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31e0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  in the returned.
31f0: 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20  ** array. Also, 
3200: 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74  *pnMaxArg is set
3210: 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f   to the larger o
3220: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
3230: 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  lue and .** the 
3240: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
3250: 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70  s in the Vdbe.ap
3260: 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75  Arg[] array requ
3270: 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  ired to execute 
3280: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
3290: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62   program..*/.Vdb
32a0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
32b0: 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65  TakeOpArray(Vdbe
32c0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20   *p, int *pnOp, 
32d0: 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a  int *pnMaxArg){.
32e0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20    VdbeOp *aOp = 
32f0: 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->aOp;.  assert
3300: 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d  ( aOp && !p->db-
3310: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3320: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
3330: 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  t sqlite3VdbeUse
3340: 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74  sBtree() was not
3350: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
3360: 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  VM */.  assert( 
3370: 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d 75 74 65 78  p->aMutex.nMutex
3380: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  ==0 );..  resolv
3390: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
33a0: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
33b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
33c0: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
33d0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
33e0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
33f0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
3400: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
3410: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
3420: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
3430: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
3440: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
3450: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
3460: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
3470: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
3480: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
3490: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
34a0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
34b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
34c0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
34d0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
34e0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
34f0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3500: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
3510: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
3520: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
3530: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3540: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3550: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3560: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3570: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3580: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3590: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
35a0: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
35b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
35c0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
35d0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
35e0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
35f0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3600: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71   if( p2<0 && (sq
3610: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
3620: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
3630: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
3640: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
3650: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
3660: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3680: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3690: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
36a0: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
36b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
36c0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
36d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
36e0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
36f0: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
3700: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3710: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
3720: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
3730: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
3740: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
3760: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3770: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3780: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3790: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
37a0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
37b0: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
37c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
37d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
37e0: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
37f0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3800: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3810: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3820: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3830: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3840: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3850: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3870: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3880: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3890: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
38a0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
38b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
38c0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
38d0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
38e0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
38f0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
3900: 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69  ( addr>=0 );.  i
3910: 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29  f( p->nOp>addr )
3920: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3930: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
3940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3950: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3960: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
3970: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
3980: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
3990: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
39a0: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
39b0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
39c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
39d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
39e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
39f0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3a00: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3a10: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3a20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3a30: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3a40: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
3a50: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3a60: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3a70: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
3a80: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3a90: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3aa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3ab0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
3ac0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3ad0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3ae0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
3af0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
3b00: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
3b10: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3b20: 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20  ddr].p3 = val;. 
3b30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3b40: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3b50: 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66  the P5 operand f
3b60: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
3b70: 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70  ntly.** added op
3b80: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  eration..*/.void
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3ba0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
3bb0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3bc0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
3bd0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->aOp ){.    ass
3be0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
3bf0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
3c00: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a  Op-1].p5 = val;.
3c10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3c20: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
3c30: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
3c40: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
3c50: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3c60: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3c70: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3c80: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
3c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3ca0: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
3cb0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3cc0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
3cd0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
3ce0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
3cf0: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
3d00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
3d10: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
3d20: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
3d30: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
3d40: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
3d50: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
3d60: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
3d70: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
3d80: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
3d90: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ralFunction(sqli
3da0: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
3db0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41   *pDef){.  if( A
3dc0: 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28  LWAYS(pDef) && (
3dd0: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
3de0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
3df0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
3e00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
3e10: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
3e20: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
3e30: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
3e40: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
3e50: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
3e60: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
3e70: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
3e80: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
3e90: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
3ea0: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
3eb0: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
3ec0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
3ed0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
3ee0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
3ef0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
3f00: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
3f10: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
3f20: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
3f30: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
3f40: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
3f50: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f60: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
3f70: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
3f80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
3f90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3fa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3fb0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
3fc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
3fd0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
3fe0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
3ff0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
4000: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4010: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46     case P4_VDBEF
4020: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  UNC: {.        V
4030: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
4040: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a  nc = (VdbeFunc *
4050: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65  )p4;.        fre
4060: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4070: 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63  on(db, pVdbeFunc
4080: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  ->pFunc);.      
4090: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
40a0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
40b0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
40c0: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20  Data(pVdbeFunc, 
40d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
40e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
40f0: 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  dbeFunc);.      
4100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4110: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
4120: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4130: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
4140: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
4150: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
4160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4170: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4180: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  MEM: {.        i
4190: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
41a0: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
41b0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
41c0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
41d0: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
41e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41f0: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d     Mem *p = (Mem
4200: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20  *)p4;.          
4210: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4220: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
4230: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4240: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
4250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4270: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54        case P4_VT
4280: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  AB : {.        i
4290: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
42a0: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
42b0: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
42c0: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
42d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
42e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
42f0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
4300: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
4310: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
4320: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
4330: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
4340: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
4350: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
4360: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
4370: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
4380: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
4390: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
43a0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
43b0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
43c0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
43d0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
43e0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
43f0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
4400: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
4410: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
4420: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
4430: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
4440: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4450: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
4460: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
4470: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
4480: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
4490: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
44a0: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
44b0: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
44c0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
44d0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
44e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
44f0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
4500: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
4510: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
4520: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
4530: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
4540: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
4550: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
4560: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
4570: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4580: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
4590: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
45a0: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
45b0: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
45c0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
45d0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
45e0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
45f0: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65   Change N opcode
4600: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64  s starting at ad
4610: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f  dr to No-ops..*/
4620: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4630: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
4640: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
4650: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
4660: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4670: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4680: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4690: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
46a0: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  b;.    while( N-
46b0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
46c0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
46d0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
46e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
46f0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
4700: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
4710: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
4720: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
4730: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4740: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4750: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
4760: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4770: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4780: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4790: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
47a0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
47b0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
47c0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
47d0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
47e0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
47f0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
4800: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
4810: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
4820: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
4830: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
4840: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
4850: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
4860: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
4870: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
4880: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4890: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
48a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
48b0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
48c0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
48d0: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
48e0: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
48f0: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
4900: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
4910: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
4920: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
4930: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
4940: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
4950: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
4960: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
4970: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
4980: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
4990: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
49a0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
49b0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
49c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
49d0: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
49e0: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
49f0: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
4a00: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
4a10: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
4a20: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
4a30: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4a40: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
4a50: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
4a60: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4a70: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4a80: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
4a90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
4aa0: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
4ab0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
4ac0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4ad0: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
4ae0: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
4af0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
4b00: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
4b10: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
4b20: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
4b30: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
4b40: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
4b50: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
4b60: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
4b70: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
4b80: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
4b90: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
4ba0: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
4bb0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
4bc0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
4bd0: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
4be0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
4bf0: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
4c00: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4c10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4c20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4c30: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
4c40: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
4c50: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
4c60: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
4c70: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
4c80: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
4c90: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4ca0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4cb0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
4cc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4cd0: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21  d ){.    if ( n!
4ce0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e  =P4_KEYINFO && n
4cf0: 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20  !=P4_VTAB ) {.  
4d00: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e      freeP4(db, n
4d10: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
4d20: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
4d30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4d50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
4d60: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
4d70: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
4d80: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
4d90: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
4da0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4db0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4dc0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4dd0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
4de0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
4df0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
4e00: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
4e10: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
4e20: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
4e30: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
4e40: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
4e50: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
4e60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
4e70: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
4e80: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
4e90: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
4ea0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
4eb0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
4ec0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
4ed0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
4ee0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4ef0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
4f00: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
4f10: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65  EYINFO ){.    Ke
4f20: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
4f30: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  .    int nField,
4f40: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69   nByte;..    nFi
4f50: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a  eld = ((KeyInfo*
4f60: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20  )zP4)->nField;. 
4f70: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
4f80: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28  f(*pKeyInfo) + (
4f90: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66  nField-1)*sizeof
4fa0: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  (pKeyInfo->aColl
4fb0: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20  [0]) + nField;. 
4fc0: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
4fd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4fe0: 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  (0, nByte);.    
4ff0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5000: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
5010: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
5020: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
5030: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
5040: 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49  cpy((char*)pKeyI
5050: 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20  nfo, zP4, nByte 
5060: 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  - nField);.     
5070: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
5080: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
5090: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
50a0: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
50b0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
50c0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
50d0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
50e0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
50f0: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
5100: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
5110: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
5120: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
5130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
5140: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5150: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
5160: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
5170: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5180: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
5190: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
51a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
51b0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
51c0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
51d0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
51e0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
51f0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
5200: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
5210: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
5220: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5230: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5240: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5250: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
5260: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
5270: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
5280: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
5290: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
52a0: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
52b0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
52c0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
52d0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
52e0: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
52f0: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
5300: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
5310: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5320: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
5330: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
5340: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
5350: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
5360: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
5370: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
5380: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
5390: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
53a0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65  mment on the the
53b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
53c0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
53d0: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
53e0: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
53f0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
5400: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
5410: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
5420: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
5430: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
5440: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
5450: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
5460: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
5470: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
5480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5490: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
54a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
54b0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
54c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
54d0: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
54e0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
54f0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
5500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5510: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5520: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5530: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5540: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5550: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5560: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
5570: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5580: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
5590: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
55a0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
55b0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
55c0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
55d0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
55e0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
55f0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5600: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5610: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
5620: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5640: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
5650: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70  ist ap;.  if( !p
5660: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
5670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5680: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73  , OP_Noop);.  as
5690: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
56a0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
56b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
56c0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
56d0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
56e0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
56f0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5700: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5710: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
5720: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5730: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
5740: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5750: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
5760: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
5770: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
5780: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5790: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
57a0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
57b0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
57c0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
57d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
57e0: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
57f0: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
5800: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
5810: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
5820: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5830: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
5840: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
5850: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5860: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5870: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5880: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5890: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
58a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
58b0: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
58c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
58d0: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
58e0: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
58f0: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
5900: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
5910: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
5920: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
5930: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
5940: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
5950: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
5960: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
5970: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c  after a OOM faul
5980: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
5990: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
59a0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
59b0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
59c0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
59d0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
59e0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
59f0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
5a00: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
5a10: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
5a20: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
5a30: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
5a40: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
5a50: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
5a60: 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75  rind..**.** Abou
5a70: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c  t the #ifdef SQL
5a80: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20  ITE_OMIT_TRACE: 
5a90: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
5aa0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
5ab0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73   called.** unles
5ac0: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69  s p->nOp>0.  Thi
5ad0: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
5ae0: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53  the absense of S
5af0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5b00: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65  ,.** an OP_Trace
5b10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5b20: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20  always inserted 
5b30: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  by sqlite3VdbeGe
5b40: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  t() as soon as.*
5b50: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20  * a new VDBE is 
5b60: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20  created.  So we 
5b70: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20  are free to set 
5b80: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31  addr to p->nOp-1
5b90: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5ba0: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65  ng to double-che
5bb0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
5bc0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
5bd0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  is non-negative.
5be0: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54   But.** if SQLIT
5bf0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20  E_OMIT_TRACE is 
5c00: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f  defined, the OP_
5c10: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64  Trace is omitted
5c20: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20   and we do need 
5c30: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20  to.** check the 
5c40: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d  value of p->nOp-
5c50: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  1 before continu
5c60: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ing..*/.VdbeOp *
5c70: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5c80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5c90: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
5ca0: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
5cb0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
5cc0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
5cd0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
5ce0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
5cf0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
5d00: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
5d10: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
5d20: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
5d30: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d  const VdbeOp dum
5d40: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
5d50: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
5d60: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
5d70: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
5d80: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5d90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5da0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5db0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5dc0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
5dd0: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
5de0: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
5df0: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
5e00: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
5e10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5e20: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
5e30: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
5e40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5e50: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
5e60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
5e70: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
5e80: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
5e90: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5ea0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
5eb0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
5ec0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
5ed0: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
5ee0: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
5ef0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
5f00: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
5f10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
5f20: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
5f30: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
5f40: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
5f50: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
5f60: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
5f70: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
5f80: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
5f90: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
5fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
5fb0: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
5fc0: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
5fd0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
5fe0: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
5ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
6000: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
6010: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
6020: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
6030: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
6040: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6050: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
6060: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
6070: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6080: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
6090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
60a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
60b0: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
60c0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
60d0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
60e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
60f0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
6100: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
6110: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
6120: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
6130: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
6140: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
6150: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
6160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
6170: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
6180: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
6190: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
61a0: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
61b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
61c0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
61d0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
61e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
61f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6200: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6210: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
6220: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
6230: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
6240: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
6250: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
6260: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6270: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
6280: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6290: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
62a0: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
62b0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
62c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
62d0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
62e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
62f0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
6300: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
6310: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
6320: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6330: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6340: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
6350: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
6360: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
6370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6380: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6390: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
63a0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
63b0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
63c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
63d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
63e0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
63f0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
6400: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
6410: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6420: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6430: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
6440: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
6450: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
6460: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6470: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
6480: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
6490: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
64a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
64b0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
64c0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
64d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
64e0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
64f0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
6500: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6510: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6520: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
6530: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6540: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6550: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
6560: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6580: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
6590: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
65a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
65b0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
65c0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
65d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
65e0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
65f0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
6600: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
6610: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
6620: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6630: 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Null)==0 );.    
6640: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
6650: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
6660: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
6670: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
6680: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
6690: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
66a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
66b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
66c0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
66d0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
66e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
66f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
6700: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6710: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6720: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6730: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
6740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6750: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
6760: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
6770: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
6780: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
6790: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
67a0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
67b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
67c0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
67d0: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
67e0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
67f0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
6800: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
6810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6820: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6830: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
6840: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
6850: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
6860: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6870: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
6880: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
6890: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
68a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
68b0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
68c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
68d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
68e0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
68f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6900: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6910: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
6920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6930: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6940: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
6950: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
6960: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
6970: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
6980: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
6990: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
69a0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
69b0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
69c0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
69d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
69e0: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
69f0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
6a00: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
6a10: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
6a20: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6a30: 65 6d 65 6e 74 20 68 61 73 20 74 6f 20 6b 6e 6f  ement has to kno
6a40: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 77 68 69  w in advance whi
6a50: 63 68 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  ch Btree objects
6a60: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .** will be used
6a70: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
6a80: 61 63 71 75 69 72 65 20 6d 75 74 65 78 65 73 20  acquire mutexes 
6a90: 6f 6e 20 74 68 65 6d 20 61 6c 6c 20 69 6e 20 73  on them all in s
6aa0: 6f 72 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 28  orted.** order (
6ab0: 76 69 61 20 73 71 6c 69 74 65 33 56 64 62 65 4d  via sqlite3VdbeM
6ac0: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 29  utexArrayEnter()
6ad0: 2e 20 20 4d 75 74 65 78 65 73 20 61 72 65 20 61  .  Mutexes are a
6ae0: 63 71 75 69 72 65 64 0a 2a 2a 20 69 6e 20 6f 72  cquired.** in or
6af0: 64 65 72 20 28 61 6e 64 20 72 65 6c 65 61 73 65  der (and release
6b00: 64 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  d in reverse ord
6b10: 65 72 29 20 74 6f 20 61 76 6f 69 64 20 64 65 61  er) to avoid dea
6b20: 64 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20  dlocks..*/.void 
6b30: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
6b40: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
6b50: 74 20 69 29 7b 0a 20 20 74 41 74 74 61 63 68 4d  t i){.  tAttachM
6b60: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  ask mask;.  asse
6b70: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6b80: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69  >db->nDb && i<si
6b90: 7a 65 6f 66 28 74 41 74 74 61 63 68 4d 61 73 6b  zeof(tAttachMask
6ba0: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
6bb0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
6bc0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
6bd0: 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32  ;.  mask = ((u32
6be0: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70  )1)<<i;.  if( (p
6bf0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61  ->btreeMask & ma
6c00: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  sk)==0 ){.    p-
6c10: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61  >btreeMask |= ma
6c20: 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  sk;.    sqlite3B
6c30: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e  treeMutexArrayIn
6c40: 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c  sert(&p->aMutex,
6c50: 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   p->db->aDb[i].p
6c60: 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66  Bt);.  }.}...#if
6c70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
6c80: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
6c90: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
6ca0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
6cb0: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
6cc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6cd0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
6ce0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
6cf0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
6d00: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
6d10: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
6d20: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
6d30: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
6d40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6d50: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
6d60: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
6d70: 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25   %4d %-4s %.2X %
6d80: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
6d90: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
6da0: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
6db0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
6dc0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
6dd0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
6de0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
6df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
6e00: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
6e10: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
6e20: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
6e30: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23   zP4, pOp->p5,.#
6e40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6e50: 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43  UG.      pOp->zC
6e60: 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43  omment ? pOp->zC
6e70: 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73  omment : "".#els
6e80: 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69  e.      "".#endi
6e90: 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  f.  );.  fflush(
6ea0: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
6eb0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6ec0: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
6ed0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
6ee0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
6ef0: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
6f00: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
6f10: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
6f20: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69   *pEnd;.    sqli
6f30: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
6f40: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
6f50: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
6f60: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66  ocFailed;.    if
6f70: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6f80: 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ed ){.      for(
6f90: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
6fa0: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
6fb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fc0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
6fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
6fe0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
6ff0: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
7000: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
7010: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
7020: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
7030: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
7040: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
7050: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
7060: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
7070: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
7080: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
7090: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
70a0: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
70b0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
70c0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
70d0: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
70e0: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
70f0: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
7100: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
7110: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
7120: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
7130: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
7140: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
7150: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
7160: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
7170: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
7180: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
7190: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
71a0: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
71b0: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
71c0: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
71d0: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
71e0: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
71f0: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
7200: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
7210: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
7220: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
7230: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
7240: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
7250: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
7260: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
7270: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
7280: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
7290: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
72a0: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
72b0: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
72c0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
72d0: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
72e0: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
72f0: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
7300: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
7310: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7320: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
7330: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
7340: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
7350: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
7360: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
7370: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
7380: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
7390: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
73a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
73b0: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
73c0: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
73d0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
73e0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
73f0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d   MEM_Null;.    }
7400: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
7410: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
7420: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
7430: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
7440: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
7450: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
7460: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
7470: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
7480: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
7490: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
74a0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
74b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
74c0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
74d0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
74e0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
74f0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
7500: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
7510: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
7520: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
7530: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
7540: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
7550: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
7560: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
7570: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
7580: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
7590: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
75a0: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
75b0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
75c0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
75d0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
75e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
75f0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
7600: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
7610: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
7620: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
7630: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
7640: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
7650: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
7660: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
7670: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
7680: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
7690: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
76a0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
76b0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
76c0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
76d0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
76e0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
76f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
7700: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
7710: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
7720: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
7730: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
7740: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
7750: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
7760: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
7770: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
7780: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
7790: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
77a0: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
77b0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
77c0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
77d0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
77e0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
77f0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
7800: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
7810: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
7820: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7830: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
7840: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
7850: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
7860: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
7890: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
78c0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
78d0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
78e0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7910: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
7920: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
7930: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
7940: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7950: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
7960: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
7970: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
79a0: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
79b0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
79c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
79d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
79e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
79f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
7a00: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7a30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
7a40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
7a70: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
7a80: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
7a90: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
7aa0: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20  /* First Mem of 
7ab0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
7ac0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
7ad0: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ain );.  assert(
7ae0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
7af0: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61  MAGIC_RUN );.  a
7b00: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
7b10: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
7b20: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
7b30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
7b40: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
7b50: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
7b60: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
7b70: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
7b80: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
7b90: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
7ba0: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
7bb0: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
7bc0: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
7bd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7be0: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
7bf0: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
7c00: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
7c10: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
7c20: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
7c30: 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72   8);..  if( p->r
7c40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
7c50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
7c60: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
7c70: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
7c80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
7c90: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
7ca0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
7cb0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
7cc0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
7cd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
7ce0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
7cf0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
7d00: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
7d10: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
7d20: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
7d30: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
7d40: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
7d50: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
7d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
7d70: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
7d80: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
7d90: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
7da0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
7db0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
7dc0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
7dd0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
7de0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
7df0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
7e00: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
7e10: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
7e20: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
7e30: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
7e40: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
7e50: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
7e60: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
7e70: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
7e80: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
7e90: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
7ea0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
7eb0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
7ec0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
7ed0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
7ee0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
7ef0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
7f00: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
7f10: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
7f20: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
7f30: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
7f40: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
7f50: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
7f60: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
7f70: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
7f80: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
7f90: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
7fa0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
7fb0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
7fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
7fd0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
7fe0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
7ff0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
8000: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
8010: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
8020: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8030: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
8040: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
8050: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
8060: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
8070: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
8080: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
8090: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
80a0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
80b0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
80c0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
80d0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
80e0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
80f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
8100: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
8110: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
8120: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
8140: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
8150: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
8160: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
8170: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
8180: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
8190: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
81a0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
81b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
81c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
81d0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
81e0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
81f0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
8200: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
8210: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
8220: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8230: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8240: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
8250: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
8260: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
8270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
8280: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
8290: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
82a0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
82b0: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
82c0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
82d0: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
82e0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
82f0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
8300: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
8310: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8320: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
8330: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
8340: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
8350: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
8360: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
8370: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
8380: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
8390: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
83a0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
83b0: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
83c0: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
83d0: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
83e0: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
83f0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
8400: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
8410: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
8420: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
8430: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
8440: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8450: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8460: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
8470: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8480: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8490: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
84a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
84d0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
84e0: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
84f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8500: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
8510: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
8520: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
8530: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8540: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
8550: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
8560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
8570: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
8580: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
8590: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
85a0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
85b0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
85c0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
85d0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
85e0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
85f0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8600: 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  an OP_Program op
8610: 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  code is encounte
8620: 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f  r (the only opco
8630: 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  de that has.    
8640: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
8650: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
8660: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
8670: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
8680: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
8690: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
86a0: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
86b0: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
86c0: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
86d0: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
86e0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c     ** has not al
86f0: 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e  ready been seen.
8700: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8710: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
8720: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
8730: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
8740: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
8750: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
8760: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
8770: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
8780: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
8790: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
87a0: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
87b0: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
87c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
87d0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
87e0: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
87f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
8800: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
8810: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
8820: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
8830: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
8840: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
8850: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
8860: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
8870: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
8880: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
8890: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
88a0: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
88b0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
88c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
88d0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
88e0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
88f0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
8900: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
8930: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8940: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8950: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
8960: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8970: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
8980: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
89b0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
89c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
89d0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
89e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
89f0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
8a00: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
8a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
8a30: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
8a40: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8a50: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
8a60: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
8a70: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
8a80: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
8a90: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
8aa0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8ab0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8ac0: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
8ad0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
8af0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
8b00: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
8b10: 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c  m;.    z = displ
8b20: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
8b30: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
8b40: 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  z!=pMem->z ){.  
8b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
8b60: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
8b70: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
8b80: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
8b90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8ba0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8bb0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8bc0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8bd0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8be0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8bf0: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
8c00: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8c10: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
8c20: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
8c30: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8c40: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8c50: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
8c60: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
8c70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
8c80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8c90: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
8ca0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8cc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8cd0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
8ce0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
8cf0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
8d00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8d10: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
8d20: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
8d30: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
8d40: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8d50: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
8d60: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
8d70: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
8d80: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
8d90: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8da0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
8db0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
8dc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8dd0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
8de0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
8df0: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
8e00: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
8e10: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
8e20: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
8e30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8e40: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8e50: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
8e60: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
8e70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
8e80: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
8e90: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8ea0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
8ed0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
8ee0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
8ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f00: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
8f10: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
8f20: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
8f30: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
8f40: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
8f50: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
8f60: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
8f70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8f80: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
8f90: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fa0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
8fb0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
8fc0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
8fd0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
8fe0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8ff0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
9000: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
9010: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
9020: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
9030: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
9040: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
9050: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
9060: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
9070: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
9080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9090: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
90a0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
90b0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
90c0: 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ++;.    printf("
90d0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
90e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
90f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9100: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
9110: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9120: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9130: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
9140: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
9150: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
9160: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
9170: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
9180: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
9190: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
91a0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
91b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
91c0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
91d0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
91e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
91f0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
9200: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
9210: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
9220: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
9230: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
9240: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
9250: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9260: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
9270: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
9280: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
9290: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
92a0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
92b0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
92c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
92d0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
92e0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
92f0: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
9300: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
9310: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
9320: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9330: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9340: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
9350: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
9360: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
9370: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
9380: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
9390: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
93a0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
93b0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
93c0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
93d0: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
93e0: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
93f0: 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  fer and return a
9400: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
9410: 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69  hat space.  If i
9420: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
9430: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
9440: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
9450: 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61  ** The pBuf para
9460: 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69  meter is the ini
9470: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20  tial value of a 
9480: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69  pointer which wi
9490: 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68  ll.** receive th
94a0: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70  e new memory.  p
94b0: 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  Buf is normally 
94c0: 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69  NULL.  If pBuf i
94d0: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69  s not.** NULL, i
94e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d  t means that mem
94f0: 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c  ory space has al
9500: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
9510: 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a  ated and that.**
9520: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
9530: 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  ould not allocat
9540: 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79  e any new memory
9550: 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20  .  When pBuf is 
9560: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70  not.** NULL simp
9570: 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20  ly return pBuf. 
9580: 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e   Only allocate n
9590: 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ew memory space 
95a0: 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20  when pBuf.** is 
95b0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74  NULL..**.** nByt
95c0: 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
95d0: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
95e0: 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  e needed..**.** 
95f0: 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74  *ppFrom points t
9600: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
9610: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
9620: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
9630: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
9640: 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70   space.  When sp
9650: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
9660: 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76  , *ppFrom is adv
9670: 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68  anced past.** th
9680: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  e end of the all
9690: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a  ocated space..**
96a0: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
96b0: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
96c0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
96d0: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
96e0: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
96f0: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
9700: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
9710: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
9720: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
9730: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
9740: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
9750: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
9760: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
9770: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
9780: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
9790: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
97a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
97b0: 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20   return pointer 
97c0: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a  will be stored *
97d0: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
97e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
97f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
9800: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20  llocate */.  u8 
9810: 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20  **ppFrom,       
9820: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c    /* IN/OUT: All
9830: 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72  ocate from *ppFr
9840: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  om */.  u8 *pEnd
9850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9860: 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74  Pointer to 1 byt
9870: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
9880: 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72  f *ppFrom buffer
9890: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74   */.  int *pnByt
98a0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e          /* If
98b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e   allocation cann
98c0: 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72  ot be made, incr
98d0: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f  ement *pnByte */
98e0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
98f0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
9900: 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20  NT(*ppFrom) );. 
9910: 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75   if( pBuf ) retu
9920: 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65  rn pBuf;.  nByte
9930: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
9940: 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f  ;.  if( &(*ppFro
9950: 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e  m)[nByte] <= pEn
9960: 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20  d ){.    pBuf = 
9970: 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a  (void*)*ppFrom;.
9980: 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e      *ppFrom += n
9990: 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Byte;.  }else{. 
99a0: 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42     *pnByte += nB
99b0: 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
99c0: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
99d0: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
99e0: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
99f0: 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20  xecution.  This 
9a00: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
9a10: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
9a20: 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63  ating stack spac
9a30: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  e and initializi
9a40: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
9a50: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
9a60: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
9a70: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
9a80: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
9a90: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
9aa0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
9ab0: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
9ac0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  ** This is the o
9ad0: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
9ae0: 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45  a VDBE from VDBE
9af0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a  _MAGIC_INIT to.*
9b00: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  * VDBE_MAGIC_RUN
9b10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
9b20: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
9b30: 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  led more than on
9b40: 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76  ce on a single v
9b50: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
9b60: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c  ** The first cal
9b70: 6c 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20  l is made while 
9b80: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51  compiling the SQ
9b90: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62  L statement. Sub
9ba0: 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73  sequent.** calls
9bb0: 20 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72   are made as par
9bc0: 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
9bd0: 20 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20   of resetting a 
9be0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a  statement to be.
9bf0: 2a 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28  ** re-executed (
9c00: 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73  from a call to s
9c10: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e  qlite3_reset()).
9c20: 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c   The nVar, nMem,
9c30: 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64   nCursor .** and
9c40: 20 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d   isExplain param
9c50: 65 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70  eters are only p
9c60: 61 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61  assed correct va
9c70: 6c 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74  lues the first t
9c80: 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74  ime.** the funct
9c90: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f  ion is called. O
9ca0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  n subsequent cal
9cb0: 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ls, from sqlite3
9cc0: 5f 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a  _reset(), nVar.*
9cd0: 2a 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61  * is passed -1 a
9ce0: 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  nd nMem, nCursor
9cf0: 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61   and isExplain a
9d00: 72 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65  re all passed ze
9d10: 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ro..*/.void sqli
9d20: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
9d30: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
9d60: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20  /.  int nVar,   
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9d90: 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53  '?' see in the S
9da0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
9db0: 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20    int nMem,     
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
9de0: 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c  mory cells to al
9df0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
9e00: 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  nCursor,        
9e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9e20: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
9e30: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
9e40: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
9e70: 72 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62  r of args in Sub
9e80: 50 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  Programs */.  in
9e90: 74 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20  t isExplain,    
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9eb0: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
9ec0: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
9ed0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
9ee0: 20 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c   usesStmtJournal
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9f00: 72 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e  rue to set Vdbe.
9f10: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
9f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
9f30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9f40: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
9f50: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
9f60: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
9f70: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
9f80: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
9f90: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
9fa0: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
9fb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
9fc0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
9fd0: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
9fe0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
9ff0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
a000: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
a010: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
a020: 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  _RUN;..  /* For 
a030: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
a040: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
a050: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
a060: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
a070: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
a080: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
a090: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
a0a0: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
a0b0: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
a0c0: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
a0d0: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
a0e0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
a0f0: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
a100: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
a110: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
a120: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
a130: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
a140: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
a150: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
a160: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
a170: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
a180: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
a190: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
a1a0: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
a1b0: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
a1c0: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
a1d0: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
a1e0: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
a1f0: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c  Cursor;..  /* Al
a200: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
a210: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
a220: 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  s, SQL variables
a230: 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61  , VDBE cursors a
a240: 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61  nd .  ** an arra
a250: 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c  y to marshal SQL
a260: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
a270: 6e 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20  nts in. This is 
a280: 6f 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20  only done the.  
a290: 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  ** first time th
a2a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a2b0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65  alled for a give
a2c0: 6e 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e  n VDBE, not when
a2d0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e   it is.  ** bein
a2e0: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71  g called from sq
a2f0: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f  lite3_reset() to
a300: 20 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75   reset the virtu
a310: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f  al machine..  */
a320: 0a 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26  .  if( nVar>=0 &
a330: 26 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c  & ALWAYS(db->mal
a340: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b  locFailed==0) ){
a350: 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20  .    u8 *zCsr = 
a360: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
a370: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20  >nOp];       /* 
a380: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
a390: 20 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a   for alloation *
a3a0: 2f 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d  /.    u8 *zEnd =
a3b0: 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70   (u8 *)&p->aOp[p
a3c0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
a3d0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
a3e0: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a   available mem *
a3f0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a420: 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20   How much extra 
a430: 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f  memory needed */
a440: 0a 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56  ..    resolveP2V
a450: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
a460: 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  .    p->usesStmt
a470: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
a480: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20  esStmtJournal;. 
a490: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
a4a0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
a4b0: 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a       nMem = 10;.
a4c0: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
a4d0: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
a4e0: 43 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b  Csr);.    zCsr +
a4f0: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
a500: 29 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28  )&7;.    assert(
a510: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
a520: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a  NMENT(zCsr) );..
a530: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f      /* Memory fo
a540: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
a550: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
a560: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
a570: 65 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a  ed in two.    **
a580: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
a590: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
a5a0: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
a5b0: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
a5c0: 20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20   .    ** end of 
a5d0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
a5e0: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
a5f0: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
a600: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  ll memory.    **
a610: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
a620: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
a630: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
a640: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
a650: 20 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c      ** pass will
a660: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
a670: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
a680: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
a690: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
a6a0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
a6b0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
a6c0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
a6d0: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
a6e0: 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76     ** the leftov
a6f0: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
a700: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
a710: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
a720: 69 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a  ificantly.    **
a730: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
a740: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
a750: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
a760: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
a770: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
a780: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
a790: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
a7a0: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
a7b0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
a7c0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
a7d0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d  nByte);.      p-
a7e0: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
a7f0: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
a800: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
a810: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
a820: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41  e);.      p->apA
a830: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
a840: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
a850: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
a860: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a870: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61  );.      p->azVa
a880: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
a890: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
a8a0: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
a8b0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a8c0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  );.      p->apCs
a8d0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
a8e0: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
a8f0: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
a900: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
a930: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
a940: 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
a950: 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71     p->pFree = sq
a960: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a970: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
a980: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72      }.      zCsr
a990: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
a9a0: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
a9b0: 6e 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69  nByte];.    }whi
a9c0: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62  le( nByte && !db
a9d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a9e0: 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  ;..    p->nCurso
a9f0: 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72  r = (u16)nCursor
aa00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61  ;.    if( p->aVa
aa10: 72 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56  r ){.      p->nV
aa20: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
aa30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ;.      for(n=0;
aa40: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
aa50: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
aa60: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
aa70: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
aa80: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
aa90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aaa0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
aab0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  .      p->aMem--
aac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aad0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
aae0: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
aaf0: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e  em */.      p->n
ab00: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
ab20: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
ab30: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20  .nMem-1 */.     
ab40: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
ab50: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; n++){.       
ab60: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
ab70: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
ab80: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
ab90: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
aba0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
abb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
abc0: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e    for(n=1; n<p->
abd0: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
abe0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
abf0: 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d  n].db==db );.  }
ac00: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63  .#endif..  p->pc
ac10: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
ac20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
ac30: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
ac40: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78  E_Abort;.  p->ex
ac50: 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61  plain |= isExpla
ac60: 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  in;.  p->magic =
ac70: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
ac80: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
ac90: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
aca0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
acb0: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
acc0: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
acd0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
ace0: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
acf0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
ad00: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
ad10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
ad20: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
ad30: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
ad40: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
ad50: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
ad60: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
ad70: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ad80: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
ad90: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
ada0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
adb0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
adc0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
add0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
ade0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
adf0: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
ae00: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
ae10: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
ae20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
ae30: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
ae40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ae50: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
ae60: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
ae70: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
ae80: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
ae90: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
aea0: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
aeb0: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
aec0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
aed0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
aee0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
aef0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
af00: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
af10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
af20: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
af30: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
af40: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
af50: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
af60: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
af70: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
af80: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
af90: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
afa0: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
afb0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
afc0: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d  thod = 1;.    pM
afd0: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
afe0: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
aff0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
b000: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
b010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
b020: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
b030: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
b040: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
b050: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
b060: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
b070: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
b080: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
b090: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
b0a0: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
b0b0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
b0c0: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
b0d0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
b0e0: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
b0f0: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
b100: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
b110: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
b120: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
b130: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
b140: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
b150: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
b160: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
b170: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
b180: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
b190: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
b1a0: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
b1b0: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
b1c0: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
b1d0: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
b1e0: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
b1f0: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
b200: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
b210: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
b220: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
b230: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
b240: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
b250: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
b260: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
b270: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
b280: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
b290: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
b2a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
b2b0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
b2c0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
b2d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
b2e0: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
b2f0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
b300: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
b310: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
b320: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
b330: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
b340: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
b350: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
b360: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
b370: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
b380: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
b390: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
b3a0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
b3c0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
b3d0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d  ;.  }.  p->pFram
b3e0: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61  e = 0;.  p->nFra
b3f0: 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  me = 0;..  if( p
b400: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
b410: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
b420: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
b430: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
b440: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
b450: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
b460: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
b470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
b480: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
b490: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
b4a0: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
b4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
b4c0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
b4d0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b4e0: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
b4f0: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
b500: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
b510: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
b520: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
b530: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
b540: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
b550: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
b560: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
b570: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
b580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
b590: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
b5a0: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
b5b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
b5c0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
b5d0: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
b5e0: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
b5f0: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
b600: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
b610: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
b620: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
b630: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
b640: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
b650: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
b660: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
b670: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
b680: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
b690: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b6a0: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
b6b0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
b6c0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
b6d0: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
b6e0: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
b6f0: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
b700: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b710: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
b720: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
b730: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
b740: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
b750: 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d  ->apCsr==0 || p-
b760: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
b770: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
b780: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
b790: 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c  rt( p->aMem==0 |
b7a0: 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  | p->aMem[i].fla
b7b0: 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  gs==MEM_Null );.
b7c0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b7d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
b7e0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
b7f0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
b800: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
b810: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b820: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
b830: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
b840: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
b850: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
b860: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
b870: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
b880: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
b890: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
b8a0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
b8b0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
b8c0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
b8d0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
b8e0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
b8f0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
b900: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
b910: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
b920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
b930: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
b940: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
b950: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
b960: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
b970: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
b980: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
b990: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
b9a0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
b9b0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
b9c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b9d0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
b9e0: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
b9f0: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
ba00: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
ba10: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
ba20: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
ba30: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
ba40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ba50: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
ba60: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
ba70: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
ba80: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
ba90: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
baa0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
bab0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
bac0: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
bad0: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
bae0: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
baf0: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
bb00: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
bb10: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
bb20: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
bb30: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
bb40: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
bb50: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
bb60: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
bb70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
bb80: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
bb90: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
bba0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
bbb0: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
bbc0: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
bbd0: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
bbe0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
bbf0: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
bc00: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
bc10: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
bc20: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
bc30: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
bc40: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
bc50: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
bc60: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
bc70: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
bc80: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
bc90: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
bca0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
bcb0: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
bcc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bcd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
bce0: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
bcf0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
bd20: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
bd30: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
bd40: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
bd70: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
bd80: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
bd90: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
bda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
bdb0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
bdc0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
bdd0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
bde0: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
bdf0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
be00: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
be10: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
be20: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
be30: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
be40: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
be50: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
be60: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
be70: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
be80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
be90: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
bea0: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
beb0: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
bec0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
bed0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bee0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
bef0: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
bf00: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
bf10: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
bf20: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
bf30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
bf40: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
bf50: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
bf60: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
bf70: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
bf80: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
bf90: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
bfa0: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
bfb0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
bfc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
bfd0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
bfe0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
bff0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
c000: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
c010: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
c020: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
c030: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
c040: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
c050: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
c060: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
c070: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
c080: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
c090: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
c0a0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
c0b0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
c0c0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
c0d0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
c0e0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
c0f0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
c100: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
c110: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
c120: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
c130: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
c140: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
c150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c160: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
c170: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  it = 0;..#ifdef 
c180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
c190: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69  UALTABLE.  /* Wi
c1a0: 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  th this option, 
c1b0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
c1c0: 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
c1d0: 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20  be simply .  ** 
c1e0: 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69  SQLITE_OK so p i
c1f0: 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a  s not used. .  *
c200: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
c210: 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ETER(p);.#endif.
c220: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
c230: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
c240: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
c250: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
c260: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
c270: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
c280: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
c290: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
c2a0: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
c2b0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
c2c0: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
c2d0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c2e0: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
c2f0: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
c300: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
c310: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
c320: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
c330: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
c340: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
c350: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
c360: 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  c(db, &p->zErrMs
c370: 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  g);..  /* This l
c380: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
c390: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
c3a0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
c3b0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
c3c0: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
c3d0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
c3e0: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
c3f0: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
c400: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
c410: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
c420: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
c430: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
c440: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
c450: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c460: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
c470: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
c480: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
c490: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
c4a0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
c4b0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
c4c0: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
c4d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
c4e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
c4f0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
c500: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
c510: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c520: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
c530: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
c540: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
c550: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
c560: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72  Trans++;.      r
c570: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c580: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
c590: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
c5a0: 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBt));.    }.  }
c5b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c5c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
c5d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
c5e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
c5f0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
c600: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
c610: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
c620: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
c630: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
c640: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
c650: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
c660: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
c670: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
c680: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c690: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c6a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
c6b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
c6c0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
c6d0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
c6e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c6f0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
c700: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
c710: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
c720: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
c730: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
c740: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
c750: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
c760: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
c770: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c790: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
c7a0: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
c7b0: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
c7c0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
c7d0: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
c7e0: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
c7f0: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
c800: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
c810: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
c820: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
c830: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
c840: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
c850: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
c860: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
c870: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
c880: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
c890: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
c8a0: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
c8b0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c8c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c8d0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
c8e0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
c8f0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
c900: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
c910: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
c920: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
c930: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
c940: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
c950: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
c960: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
c970: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
c980: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
c990: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
c9a0: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
c9b0: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
c9c0: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
c9d0: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
c9e0: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
c9f0: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
ca00: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
ca10: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
ca20: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
ca30: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
ca40: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
ca50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
ca60: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
ca70: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
ca80: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
ca90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
caa0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
cab0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
cac0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
cad0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
cae0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
caf0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cb00: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
cb10: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
cb20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cb30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
cb40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
cb50: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
cb60: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
cb70: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
cb80: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
cb90: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
cba0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cbb0: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
cbc0: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
cbd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cbe0: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
cbf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
cc00: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
cc10: 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69  tomicly..  */.#i
cc20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cc30: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
cc40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
cc50: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
cc60: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
cc70: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
cc80: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
cc90: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
cca0: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
ccb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
ccc0: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
ccd0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
cce0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
ccf0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
cd00: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
cd10: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
cd20: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
cd30: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  .    int res;.. 
cd40: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
cd50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cd60: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64  le name */.    d
cd70: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
cd80: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
cd90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cda0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
cdb0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
cdc0: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
cdd0: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
cde0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
cdf0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ce00: 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d   "%s-mj%08X", zM
ce10: 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d  ainFile, iRandom
ce20: 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20  &0x7fffffff);.  
ce30: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
ce40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ce60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
ce70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
ce80: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
ce90: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
cea0: 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
ceb0: 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
cec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
ced0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
cee0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cef0: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
cf00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
cf10: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
cf20: 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
cf30: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
cf40: 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
cf50: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
cf60: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
cf70: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
cf80: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
cf90: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
cfa0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
cfb0: 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
cfc0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
cfd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cfe0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
cff0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d000: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
d010: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
d020: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
d030: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
d040: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
d050: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d060: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
d070: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
d080: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
d090: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
d0a0: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
d0b0: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
d0c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d0d0: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
d0e0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
d100: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
d110: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
d120: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
d130: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
d140: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
d150: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
d160: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
d170: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
d180: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
d190: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d1a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d1b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d1c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
d1d0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
d1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d1f0: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
d200: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
d210: 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
d220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
d230: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
d240: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
d250: 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
d260: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
d270: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
d280: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d290: 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
d2b0: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
d2c0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
d2d0: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
d2e0: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
d2f0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
d300: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d310: 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
d320: 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
d330: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
d340: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
d350: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
d360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
d370: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
d380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d390: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
d3a0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
d3b0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
d3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
d3d0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
d3e0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
d3f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d400: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d410: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
d420: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
d430: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d440: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
d450: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d460: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
d470: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
d480: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
d490: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
d4a0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
d4b0: 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
d4c0: 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
d4d0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
d4e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
d4f0: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
d500: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
d510: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
d520: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d530: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
d540: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
d550: 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
d560: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
d570: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
d580: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
d590: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
d5a0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
d5b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d5c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
d5d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d5e0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
d5f0: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
d600: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
d610: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
d620: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
d630: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
d640: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
d650: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
d660: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
d670: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
d680: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
d690: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
d6a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d6b0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
d6c0: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
d6d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
d6e0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
d6f0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
d700: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d710: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
d720: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
d730: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
d740: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
d750: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
d760: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
d770: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
d780: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
d790: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d7a0: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
d7b0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
d7c0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
d7d0: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
d7e0: 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
d7f0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
d800: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d810: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d820: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
d830: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
d840: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
d850: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
d860: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d870: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
d880: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
d890: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d8a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
d8b0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
d8c0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d8d0: 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
d8e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d8f0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
d900: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d910: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
d920: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
d930: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
d940: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d950: 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
d960: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
d970: 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
d980: 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
d990: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
d9a0: 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
d9b0: 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
d9c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
d9d0: 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
d9e0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
d9f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
da00: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
da10: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
da20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
da30: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
da40: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
da50: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
da60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
da70: 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
da80: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
da90: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
daa0: 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
dab0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
dac0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
dad0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
dae0: 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
daf0: 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
db00: 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
db10: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
db20: 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
db30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
db40: 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
db50: 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
db60: 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
db70: 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
db80: 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
db90: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
dba0: 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
dbb0: 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
dbc0: 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
dbd0: 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
dbe0: 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
dbf0: 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
dc00: 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
dc10: 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
dc20: 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
dc30: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
dc40: 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
dc50: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
dc60: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
dc70: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
dc80: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
dc90: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
dca0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
dcb0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
dcc0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
dcd0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
dce0: 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
dcf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
dd00: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
dd10: 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
dd20: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
dd30: 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
dd40: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
dd50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
dd60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dd70: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
dd80: 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
dd90: 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65  e sqlite3.active
dda0: 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61  VdbeCnt count va
ddb0: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
ddc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ddd0: 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
dde0: 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
ddf0: 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
de00: 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
de10: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
de20: 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
de30: 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
de40: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
de50: 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
de60: 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
de70: 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
de80: 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
de90: 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
dea0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
deb0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
dec0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
ded0: 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
dee0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
def0: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
df00: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
df10: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
df20: 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70   nWrite = 0;.  p
df30: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
df40: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
df50: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
df60: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20  BE_MAGIC_RUN && 
df70: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
df80: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
df90: 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  f( p->readOnly==
dfa0: 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  0 ) nWrite++;.  
dfb0: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
dfc0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
dfd0: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74  rt( cnt==db->act
dfe0: 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20  iveVdbeCnt );.  
dff0: 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
e000: 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
e010: 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   );.}.#else.#def
e020: 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56  ine checkActiveV
e030: 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66  dbeCnt(x).#endif
e040: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  ../*.** For ever
e050: 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20  y Btree that in 
e060: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e070: 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a  ion db which .**
e080: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
e090: 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e  ed, "trip" or in
e0a0: 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75  validate each cu
e0b0: 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20  rsor in.** that 
e0c0: 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65  Btree might have
e0d0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73   been modified s
e0e0: 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  o that the curso
e0f0: 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62  r.** can never b
e100: 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54  e used again.  T
e110: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
e120: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20   a rollback.*** 
e130: 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65  occurs.  We have
e140: 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65   to trip all the
e150: 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20   other cursors, 
e160: 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66  even.** cursor f
e170: 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e  rom other VMs in
e180: 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62   different datab
e190: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c  ase connections,
e1a0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65  .** so that none
e1b0: 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20   of them try to 
e1c0: 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20  use the data at 
e1d0: 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65  which they.** we
e1e0: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20  re pointing and 
e1f0: 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61  which now may ha
e200: 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  ve been changed 
e210: 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f  due.** to the ro
e220: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65  llback..**.** Re
e230: 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f  member that a ro
e240: 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74  llback can delet
e250: 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74  e tables complet
e260: 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72  e and.** reorder
e270: 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20   rootpages.  So 
e280: 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
e290: 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76  ient just to sav
e2a0: 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f  e.** the state o
e2b0: 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57  f the cursor.  W
e2c0: 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69  e have to invali
e2d0: 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a  date the cursor.
e2e0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ** so that it is
e2f0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69   never used agai
e300: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
e310: 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73  d invalidateCurs
e320: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
e330: 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ees(sqlite3 *db)
e340: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
e350: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
e360: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
e370: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
e380: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
e390: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
e3a0: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
e3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e3c0: 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
e3d0: 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29  p, SQLITE_ABORT)
e3e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e3f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
e400: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
e410: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
e420: 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
e430: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
e440: 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
e450: 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
e460: 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
e470: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
e480: 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
e490: 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
e4a0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e4b0: 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
e4c0: 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
e4d0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
e4e0: 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
e4f0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e500: 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
e510: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
e520: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65  ction is commtte
e530: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
e540: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
e550: 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
e560: 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
e570: 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
e580: 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
e590: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
e5a0: 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
e5b0: 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
e5c0: 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
e5d0: 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
e5e0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
e5f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
e600: 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
e610: 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
e620: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e630: 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
e640: 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
e650: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
e660: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
e670: 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
e680: 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
e690: 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
e6a0: 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
e6b0: 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  cured, causing a
e6c0: 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
e6d0: 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
e6e0: 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
e6f0: 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
e700: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
e710: 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
e720: 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
e730: 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
e740: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
e750: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
e760: 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
e770: 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
e780: 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
e790: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e7a0: 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
e7b0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
e7c0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
e7d0: 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
e7e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
e7f0: 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
e800: 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
e810: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
e820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e830: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e840: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
e850: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
e860: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e870: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e880: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
e890: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
e8a0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
e8b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
e8c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
e8d0: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
e8e0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e8f0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
e900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e910: 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
e920: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e930: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
e940: 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
e950: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
e960: 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
e970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e980: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e990: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e9a0: 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
e9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e9c0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
e9d0: 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
e9e0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
e9f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
ea00: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ea10: 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
ea20: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
ea30: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
ea40: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
ea50: 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
ea60: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
ea70: 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
ea80: 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
ea90: 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
eaa0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
eab0: 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
eac0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
ead0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
eae0: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
eaf0: 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
eb00: 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
eb10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
eb20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
eb30: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
eb40: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
eb50: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
eb60: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
eb70: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
eb80: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
eb90: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
eba0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
ebb0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
ebc0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
ebd0: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
ebe0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
ebf0: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
ec00: 20 73 6f 20 69 74 0a 2a 2a 20 73 65 74 73 20 74   so it.** sets t
ec10: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
ec20: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
ec30: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
ec40: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
ec50: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
ec60: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
ec70: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
ec80: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
ec90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
eca0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
ecb0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
ecc0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ecd0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
ece0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
ecf0: 6e 74 65 72 41 6c 6c 28 29 20 69 73 20 69 6e 76  nterAll() is inv
ed00: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
ed10: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
ed20: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
ed30: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
ed40: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
ed50: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
ed60: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
ed70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ed80: 65 20 56 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20  e VM. Of course 
ed90: 6f 6e 6c 79 20 61 20 73 75 62 73 65 74 20 6f 66  only a subset of
eda0: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
edb0: 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 61 63 63  s.** will be acc
edc0: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 2c  essed by the VM,
edd0: 20 61 6e 64 20 77 65 20 63 6f 75 6c 64 20 75 73   and we could us
ede0: 65 20 56 64 62 65 2e 62 74 72 65 65 4d 61 73 6b  e Vdbe.btreeMask
edf0: 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a 20 74 68   to figure.** th
ee00: 61 74 20 73 75 62 73 65 74 20 6f 75 74 2c 20 62  at subset out, b
ee10: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  ut there is no a
ee20: 64 76 61 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e  dvantage to doin
ee30: 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  g so..**.** If S
ee40: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
ee50: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
ee60: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
ee70: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
ee80: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
ee90: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
eea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eeb0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
eec0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
eed0: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72  eMutexArrayEnter
eee0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 53  (Vdbe *p){.#if S
eef0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
ef00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  .  sqlite3BtreeM
ef10: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26  utexArrayEnter(&
ef20: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73  p->aMutex);.#els
ef30: 65 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  e.  sqlite3Btree
ef40: 45 6e 74 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b  EnterAll(p->db);
ef50: 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
ef60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ef70: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
ef80: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
ef90: 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
efa0: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
efb0: 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
efc0: 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
efd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
efe0: 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
eff0: 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
f000: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
f010: 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
f020: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
f030: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
f040: 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
f050: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
f060: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
f070: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
f080: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
f090: 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
f0a0: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
f0b0: 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
f0c0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
f0d0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
f0e0: 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
f0f0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72  ONSTRAINT and wr
f100: 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ite.** an error 
f110: 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
f120: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
f130: 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
f140: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f150: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
f160: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
f170: 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
f180: 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
f190: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
f1a0: 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
f1b0: 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  d && db->nDeferr
f1c0: 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64  edCons>0) || (!d
f1d0: 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
f1e0: 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29  kConstraint>0) )
f1f0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
f200: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
f210: 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
f220: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
f230: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
f240: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
f250: 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  , db, "foreign k
f260: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
f270: 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
f280: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
f290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f2a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
f2b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
f2c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f2d0: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
f2e0: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
f2f0: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
f300: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
f310: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
f320: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
f330: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
f340: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
f350: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
f360: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
f370: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
f380: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
f390: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
f3a0: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
f3b0: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
f3c0: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
f3d0: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
f3e0: 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
f3f0: 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
f400: 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
f410: 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
f420: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
f430: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
f440: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f450: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
f460: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
f470: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
f480: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
f490: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f4a0: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
f4b0: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
f4c0: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
f4d0: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
f4e0: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
f4f0: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
f500: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f510: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
f520: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
f550: 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
f560: 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
f570: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f580: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
f590: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
f5a0: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
f5b0: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
f5c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
f5d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f5e0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
f5f0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
f600: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
f610: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
f620: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
f630: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
f640: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
f650: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f660: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
f670: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
f680: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
f690: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
f6a0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
f6b0: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
f6c0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
f6d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
f6e0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
f6f0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
f700: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
f710: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
f720: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
f730: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
f740: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f750: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
f760: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
f770: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
f780: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
f790: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
f7a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
f7b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
f7c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f7d0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
f7e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
f7f0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
f800: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
f810: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
f820: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
f830: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f840: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
f850: 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
f860: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
f870: 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
f880: 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
f890: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
f8a0: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
f8b0: 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
f8c0: 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
f8d0: 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
f8e0: 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
f8f0: 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
f900: 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
f910: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
f920: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
f930: 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
f940: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
f950: 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
f960: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
f970: 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
f980: 33 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45  3VdbeMutexArrayE
f990: 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
f9a0: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
f9b0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
f9c0: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
f9d0: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
f9e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
f9f0: 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
fa00: 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54  BLOCKED );  /* T
fa10: 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e  his error no lon
fa20: 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ger exists */.  
fa30: 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
fa40: 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
fa50: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
fa60: 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
fa80: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
fa90: 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
faa0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
fab0: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
fac0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
fad0: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
fae0: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
faf0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
fb00: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
fb10: 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
fb20: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
fb30: 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
fb40: 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
fb50: 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
fb70: 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
fb80: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
fb90: 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
fba0: 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
fbb0: 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
fbc0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
fbd0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
fbe0: 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
fbf0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
fc00: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
fc10: 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
fc20: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
fc30: 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
fc40: 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
fc50: 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65  .      ** occure
fc60: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
fc70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
fc80: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
fc90: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
fca0: 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
fcb0: 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
fcc0: 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
fcd0: 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
fce0: 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
fcf0: 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
fd00: 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
fd10: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
fd20: 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
fd30: 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
fd40: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
fd50: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
fd60: 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
fd70: 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
fd80: 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
fd90: 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
fda0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
fdb0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
fdc0: 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
fdd0: 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
fde0: 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
fdf0: 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
fe00: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
fe10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fe20: 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
fe30: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
fe40: 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
fe50: 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
fe60: 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
fe70: 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
fe80: 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
fe90: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
fea0: 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
feb0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
fec0: 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69            invali
fed0: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
fee0: 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
fef0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ff00: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
ff10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ff20: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
ff30: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
ff40: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
ff50: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
ff60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ff70: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
ff80: 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
ff90: 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
ffa0: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
ffb0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ffc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ffd0: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
ffe0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
fff0: 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
10000 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
10010 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
10020 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
10030 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
10040 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
10050 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
10060 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
10070 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
10080 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
10090 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
100a0 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
100b0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
100c0 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
100d0 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
100e0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
100f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
10100 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
10110 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
10120 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
10130 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56     && db->writeV
10140 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64  dbeCnt==(p->read
10150 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
10160 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
10180 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10190 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
101a0 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
101b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
101c0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
101d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
101e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
101f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10200 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
10210 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
10220 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
10230 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
10240 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
10250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10260 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
10270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10290 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
102a0 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
102b0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
102c0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
102d0 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
102e0 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
102f0 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20  ssful .         
10300 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f   ** or hit an 'O
10310 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
10320 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
10330 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   no deferred for
10340 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  eign.          *
10350 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
10360 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
10370 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10380 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
10390 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
103a0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
103b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
103c0 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
103d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
103f0 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
10400 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10410 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10420 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
10430 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20  &p->aMutex);.   
10440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10450 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
10460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
10470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10480 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10490 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
104a0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
104b0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  (db);.        }e
104c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
104d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
104e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
104f0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
10500 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
10510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10530 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10540 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
10550 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
10560 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
10570 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
10580 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
10590 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
105a0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
105b0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
105c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
105d0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
105e0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
105f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10600 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10610 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
10620 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10630 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
10640 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
10650 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  e{.        inval
10660 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
10670 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
10680 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10690 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
106a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
106b0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
106c0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
106d0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
106e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
106f0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
10700 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
10710 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
10720 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10730 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
10740 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
10750 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
10760 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
10770 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
10780 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
10790 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
107a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
107b0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
107c0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
107d0 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
107e0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
107f0 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
10800 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
10810 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
10820 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
10830 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
10840 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
10850 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  hat sqlite3VdbeC
10860 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
10870 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66  can only fail if
10880 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20   eStatementOp.  
10890 20 20 2a 2a 20 69 73 20 53 41 56 45 50 4f 49 4e    ** is SAVEPOIN
108a0 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 42 75 74  T_ROLLBACK.  But
108b0 20 69 66 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   if p->rc==SQLIT
108c0 45 5f 4f 4b 20 74 68 65 6e 20 65 53 74 61 74 65  E_OK then eState
108d0 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 6d 75  mentOp.    ** mu
108e0 73 74 20 62 65 20 53 41 56 45 50 4f 49 4e 54 5f  st be SAVEPOINT_
108f0 52 45 4c 45 41 53 45 2e 20 20 48 65 6e 63 65 20  RELEASE.  Hence 
10900 74 68 65 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d  the NEVER(p->rc=
10910 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 69 6e 20 0a  =SQLITE_OK) in .
10920 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
10930 77 69 6e 67 20 63 6f 64 65 2e 0a 20 20 20 20 2a  wing code..    *
10940 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
10950 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
10960 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10970 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
10980 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
10990 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
109a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
109b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 53   eStatementOp==S
109c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
109d0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  K );.        if(
109e0 20 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51   NEVER(p->rc==SQ
109f0 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72  LITE_OK) || p->r
10a00 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
10a10 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
10a20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
10a40 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
10a50 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
10a60 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
10a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10a80 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
10a90 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
10aa0 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10ab0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10ac0 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10ad0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10ae0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10af0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10b00 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10b10 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10b20 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
10b30 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10b40 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
10b50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10b60 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
10b70 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
10b80 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
10b90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10ba0 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
10bb0 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
10bc0 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
10bd0 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
10be0 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
10bf0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10c10 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10c20 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
10c30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10c50 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
10c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10c70 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
10c80 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
10c90 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
10ca0 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
10cb0 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
10cc0 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
10cd0 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
10ce0 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
10cf0 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
10d00 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
10d10 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
10d20 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
10d30 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
10d40 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
10d50 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10d60 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
10d70 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
10d80 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
10d90 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10da0 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10db0 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
10dc0 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
10dd0 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
10de0 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
10df0 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
10e00 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
10e10 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
10e20 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
10e30 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
10e40 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10e50 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10e60 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
10e70 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
10e80 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
10e90 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
10ea0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
10eb0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
10ec0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10ed0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
10ee0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10ef0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
10f00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10f10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10f20 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10f30 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
10f40 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
10f50 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
10f60 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
10f70 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
10f80 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
10f90 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
10fa0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
10fb0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
10fc0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
10fd0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
10fe0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
10ff0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
11000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
11010 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
11020 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
11030 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
11040 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
11050 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
11060 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
11070 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
11080 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
11090 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
110a0 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
110b0 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
110c0 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
110d0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
110e0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
110f0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
11100 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
11110 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
11120 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
11130 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
11140 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
11150 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
11160 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
11170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11180 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
11190 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
111a0 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
111b0 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
111c0 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
111d0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
111e0 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
111f0 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
11200 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
11210 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
11220 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
11230 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
11240 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
11250 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
11260 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
11270 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
11280 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
11290 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
112a0 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
112b0 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
112c0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
112d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
112e0 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
112f0 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
11300 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
11310 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
11320 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11330 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
11340 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
11350 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
11360 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
11370 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
11380 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
11390 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
113a0 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
113b0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
113c0 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
113d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
113e0 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
113f0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
11400 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
11410 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
11420 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
11430 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
11440 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
11450 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
11460 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
11470 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
11480 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
11490 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
114a0 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
114b0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
114c0 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
114d0 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
114e0 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
114f0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
11500 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
11510 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
11520 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11530 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
11540 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11550 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11560 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
11570 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11580 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
11590 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
115a0 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
115b0 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
115c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
115d0 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72  ();.      db->er
115e0 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20  rCode = p->rc;. 
115f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11600 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
11610 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
11620 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
11630 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
11640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
11650 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
11660 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11670 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11680 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
11690 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
116a0 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65  ( p->runOnlyOnce
116b0 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20   ) p->expired = 
116c0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
116d0 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
116e0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
116f0 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
11700 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
11710 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
11720 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
11730 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
11740 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
11750 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
11760 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
11770 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
11780 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
11790 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
117a0 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
117b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
117c0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
117d0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
117e0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
117f0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
11800 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
11810 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
11820 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11830 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
11840 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
11850 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
11860 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
11870 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
11880 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
11890 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
118a0 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
118b0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
118c0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
118d0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
118e0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
118f0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
11900 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
11910 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
11920 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
11930 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
11940 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
11950 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
11960 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
11970 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
11980 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
11990 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
119a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
119b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
119c0 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n");.      for(i
119d0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
119e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
119f0 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31  ntf(out, "%6d %1
11a00 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20  0lld %8lld ",.  
11a10 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
11a20 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
11a30 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
11a40 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
11a50 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
11a60 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
11a70 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
11a80 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
11a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11aa0 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
11ab0 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
11ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
11ad0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
11ae0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
11af0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
11b00 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
11b10 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
11b20 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
11b30 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
11b40 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
11b50 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
11b60 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
11b70 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
11b80 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
11b90 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
11ba0 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
11bb0 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
11bc0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
11bd0 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
11be0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11bf0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
11c00 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
11c10 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
11c20 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
11c30 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
11c40 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
11c50 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
11c60 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
11c70 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
11c80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
11c90 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
11ca0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11cb0 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
11cc0 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
11cd0 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
11ce0 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
11cf0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
11d00 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
11d10 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
11d20 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
11d30 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
11d40 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
11d50 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
11d60 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
11d70 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
11d80 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
11d90 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
11da0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
11db0 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
11dc0 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
11dd0 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
11de0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
11df0 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
11e00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
11e10 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
11e20 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
11e30 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
11e40 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33   || !(mask&(((u3
11e50 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41  2)1)<<i))) && pA
11e60 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
11e70 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
11e80 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
11e90 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
11ea0 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
11eb0 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
11ec0 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
11ed0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
11ee0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
11ef0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
11f00 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
11f10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11f20 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  t..** The differ
11f30 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
11f40 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
11f50 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11f60 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
11f70 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
11f80 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
11f90 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
11fa0 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
11fb0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
11fc0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11fd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11fe0 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63  3VdbeDeleteObjec
11ff0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
12000 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
12010 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
12020 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ext;.  assert( p
12030 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
12040 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
12050 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
12060 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
12070 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12080 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
12090 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
120a0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
120b0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
120c0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
120d0 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
120e0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
120f0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
12100 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
12110 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
12120 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12130 53 75 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  Sub);.  }.  vdbe
12140 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12150 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
12160 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12170 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
12180 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12190 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
121a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
121b0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
121c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
121d0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
121e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
121f0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
12200 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
12210 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
12220 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12230 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
12240 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
12250 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
12260 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
12270 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ->db;.  if( p->p
12280 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
12290 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
122a0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
122b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
122c0 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
122d0 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
122e0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
122f0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
12300 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
12310 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
12320 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12330 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
12340 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
12350 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f  lite3VdbeDeleteO
12360 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a  bject(db, p);.}.
12370 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
12380 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
12390 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
123a0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
123b0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
123c0 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
123d0 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
123e0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
123f0 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
12400 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
12410 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
12420 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
12430 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
12440 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
12450 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
12460 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
12470 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
12480 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
12490 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
124a0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
124b0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
124c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
124d0 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
124e0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
124f0 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
12500 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
12510 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
12520 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
12530 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
12540 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
12550 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
12560 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
12570 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
12580 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
12590 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
125a0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
125b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
125c0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
125d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
125e0 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
125f0 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
12600 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
12610 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
12620 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
12630 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
12640 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
12650 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
12660 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
12670 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
12680 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12690 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
126a0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
126b0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
126c0 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
126d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
126e0 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
126f0 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  id = p->movetoTa
12700 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65  rget;.    if( re
12710 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
12720 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12730 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  T;.    p->rowidI
12740 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64  sValid = 1;.#ifd
12750 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
12760 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
12770 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
12780 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
12790 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
127a0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
127b0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
127c0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
127d0 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
127e0 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
127f0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
12800 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
12810 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
12820 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
12830 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
12840 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
12850 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
12860 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
12870 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
12880 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
12890 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
128a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
128b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
128c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
128d0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
128e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
128f0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
12900 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
12910 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
12920 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
12930 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
12940 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
12950 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
12960 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
12970 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
12980 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
12990 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
129a0 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
129b0 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
129c0 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
129d0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
129e0 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
129f0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
12a00 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
12a10 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
12a20 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
12a30 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
12a40 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
12a50 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
12a60 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
12a70 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
12a80 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
12a90 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
12aa0 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
12ab0 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
12ac0 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
12ad0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
12ae0 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
12af0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
12b00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
12b10 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
12b20 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
12b30 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
12b40 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
12b50 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
12b60 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
12b70 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
12b80 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
12b90 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
12ba0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12bb0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
12bc0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
12bd0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
12be0 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
12bf0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
12c00 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
12c10 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
12c30 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12c40 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
12c50 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12c80 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12cb0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12cc0 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12ce0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12cf0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12d00 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
12d10 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
12d20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
12d30 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
12d60 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12d70 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
12d80 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
12d90 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
12da0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
12dd0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
12de0 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
12e00 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
12e10 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12e40 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
12e50 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12e80 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
12e90 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12ec0 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
12ed0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
12ee0 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
12ef0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
12f00 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
12f10 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
12f20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
12f30 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
12f40 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
12f50 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
12f60 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
12f70 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
12f80 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
12f90 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
12fa0 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
12fb0 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
12fc0 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
12fd0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
12fe0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
12ff0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
13000 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13010 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
13020 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
13030 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
13040 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
13050 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
13060 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
13070 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
13080 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
13090 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
130a0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
130b0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
130c0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
130d0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
130e0 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
130f0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
13100 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
13110 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
13120 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
13130 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
13140 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
13150 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
13160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
13170 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
13180 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20  <(-MAX_6BYTE) ) 
13190 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20  return 6;.      
131a0 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74  /* Previous test
131b0 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20   prevents:  u = 
131c0 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  -(-9223372036854
131d0 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20  775808) */.     
131e0 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c   u = -i;.    }el
131f0 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
13200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
13210 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31  <=127 ) return 1
13220 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  ;.    if( u<=327
13230 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
13240 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
13250 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
13260 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
13270 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
13280 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
13290 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
132a0 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
132b0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
132c0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
132d0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
132e0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
132f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
13300 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
13310 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
13320 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
13330 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
13340 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
13350 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
13360 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
13370 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
13380 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
13390 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
133a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
133b0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
133c0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
133d0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
133e0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
133f0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
13400 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13410 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
13420 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
13430 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
13440 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
13450 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
13460 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
13470 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
13480 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
13490 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
134a0 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
134b0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
134c0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
134d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
134e0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
134f0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
13500 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
13510 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
13520 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
13530 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
13540 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
13550 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
13560 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
13570 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
13580 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
13590 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
135a0 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
135b0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
135c0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
135d0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
135e0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
135f0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
13600 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
13610 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
13620 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
13630 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
13640 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
13650 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
13660 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
13670 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
13680 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
13690 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
136a0 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
136b0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
136c0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
136d0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
136e0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
136f0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
13700 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
13710 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
13720 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
13730 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
13740 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
13750 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
13760 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
13770 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
13780 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
13790 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
137a0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
137b0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
137c0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
137d0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
137e0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
137f0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
13800 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
13810 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
13820 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
13830 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
13840 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
13850 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
13860 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
13870 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
13880 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
13890 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
138a0 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
138b0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
138c0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
138d0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
138e0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
138f0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
13900 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
13910 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
13920 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
13930 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
13940 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
13950 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
13960 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
13970 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
13980 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
13990 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
139a0 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
139b0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
139c0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
139d0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
139e0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
139f0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
13a00 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
13a10 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
13a20 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
13a30 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
13a40 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
13a50 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
13a60 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
13a70 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
13a80 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
13a90 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
13aa0 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
13ab0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
13ac0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
13ad0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
13ae0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
13af0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
13b00 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
13b10 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
13b20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
13b30 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
13b40 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
13b50 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
13b60 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
13b70 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
13b80 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
13b90 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
13ba0 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
13bb0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
13bc0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
13bd0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
13be0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
13bf0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
13c00 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
13c10 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
13c20 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
13c30 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
13c40 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
13c50 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
13c60 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
13c70 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
13c80 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
13c90 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
13ca0 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
13cb0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
13cc0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
13cd0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
13ce0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
13cf0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
13d00 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
13d10 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
13d20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
13d30 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
13d40 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
13d50 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
13d60 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
13d70 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
13d80 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
13d90 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
13da0 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
13db0 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
13dc0 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
13dd0 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
13de0 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
13df0 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
13e00 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
13e10 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
13e20 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
13e30 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
13e40 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
13e50 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
13e60 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
13e70 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
13e80 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
13e90 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
13ea0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
13eb0 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
13ec0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
13ed0 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
13ee0 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
13ef0 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
13f00 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
13f10 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
13f20 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
13f30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13f40 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
13f50 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
13f60 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
13f70 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
13f80 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
13f90 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
13fa0 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
13fb0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
13fc0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
13fd0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
13fe0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
13ff0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14000 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
14010 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
14020 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
14030 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
14040 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
14050 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
14060 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
14070 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
14080 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
14090 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
140a0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
140b0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
140c0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
140d0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
140e0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
140f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14100 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
14110 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
14120 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
14130 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
14140 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
14150 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
14160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14170 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
14180 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
14190 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
141a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
141b0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
141c0 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
141d0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
141e0 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
141f0 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
14200 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
14210 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
14220 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14230 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
14240 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
14250 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
14260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
14270 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
14280 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
14290 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
142a0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
142b0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
142c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
142d0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
142e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
142f0 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
14300 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
14310 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
14320 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
14330 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
14340 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
14350 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
14360 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
14370 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
14380 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
14390 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
143a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
143b0 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
143c0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
143d0 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
143e0 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
143f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14400 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
14410 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
14420 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
14430 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
14440 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
14450 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
14460 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
14470 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
14480 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
14490 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
144a0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
144b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
144c0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
144d0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
144e0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
144f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14500 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
14510 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
14520 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
14530 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
14540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14550 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
14560 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
14570 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14590 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
145a0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
145b0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
145c0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
145d0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
145e0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
145f0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
14600 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
14610 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
14620 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
14630 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
14640 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
14650 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
14660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14670 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
14680 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
14690 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
146a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
146b0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
146c0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
146d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
146e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
146f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14700 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
14710 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14720 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
14730 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
14740 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
14750 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
14760 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14770 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14780 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
14790 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
147a0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
147b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
147c0 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
147d0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
147e0 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
147f0 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
14800 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14810 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14820 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
14830 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
14840 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
14850 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
14860 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
14870 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
14880 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
14890 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
148a0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
148b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
148c0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
148d0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
148e0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
148f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14900 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
14910 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
14920 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
14930 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
14940 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
14950 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
14960 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
14970 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
14980 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
14990 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
149a0 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
149b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
149c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
149d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
149e0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
149f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14a00 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
14a10 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
14a20 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
14a30 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
14a40 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
14a50 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
14a60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14a70 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
14a80 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
14a90 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
14aa0 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
14ab0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
14ac0 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
14ad0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
14ae0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
14af0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
14b00 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
14b10 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
14b20 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
14b30 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
14b40 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
14b50 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
14b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14b70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
14b80 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
14b90 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
14ba0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
14bb0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
14bc0 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
14bd0 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
14be0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
14bf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c00 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
14c10 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
14c20 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
14c30 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
14c40 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
14c50 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
14c60 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
14c70 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
14c80 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
14c90 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
14ca0 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
14cb0 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
14cc0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
14cd0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
14ce0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
14cf0 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
14d00 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
14d10 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
14d20 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14d30 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14d50 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
14d60 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
14d70 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
14d80 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14d90 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
14da0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
14db0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
14dc0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14dd0 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
14de0 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
14df0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
14e00 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
14e10 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
14e20 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
14e30 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
14e40 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
14e50 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
14e60 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14e70 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
14e80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14e90 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14ea0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14eb0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14ec0 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
14ed0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
14ee0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
14ef0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
14f00 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
14f10 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
14f20 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
14f30 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14f40 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
14f50 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14f60 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
14f70 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
14f80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
14f90 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
14fa0 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
14fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14fc0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
14fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
14fe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  }.../*.** Given 
14ff0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
15000 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
15010 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61  rd in pKey[], pa
15020 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  rse the.** recor
15030 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65  d into a Unpacke
15040 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
15050 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
15060 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
15070 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
15080 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
15090 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76  ction might prov
150a0 69 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65  ide szSpace byte
150b0 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  s of memory.** s
150c0 70 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20  pace at pSpace. 
150d0 20 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20   This space can 
150e0 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  be used to hold 
150f0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
15100 56 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VDbeParsedRecord
15110 20 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74   structure if it
15120 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
15130 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e  .  If it is.** n
15140 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73  ot big enough, s
15150 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64  pace is obtained
15160 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
15170 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lloc()..**.** Th
15180 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63  e returned struc
15190 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63  ture should be c
151a0 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20  losed by a call 
151b0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  to.** sqlite3Vdb
151c0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
151d0 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70  ecord()..*/ .Unp
151e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
151f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
15200 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
15210 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
15220 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
15230 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
15240 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
15250 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
15260 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
15270 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
15280 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
15290 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
152a0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
152b0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
152c0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  e,          /* U
152d0 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
152e0 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64  vailable to hold
152f0 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
15300 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
15310 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
15320 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
15330 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
15340 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15350 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
15360 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
15370 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
15380 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54  Record *p;  /* T
15390 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
153a0 72 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  rd that we will 
153b0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
153c0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
153d0 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
153e0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70  needed to hold p
153f0 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  , in bytes */.  
15400 69 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78  int d;.  u32 idx
15410 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  ;.  u16 u;      
15420 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
15430 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
15440 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
15450 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
15460 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
15470 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
15480 70 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d  pSpace by this m
15490 75 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  uch to 8-byte al
154a0 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f  ign it */.  .  /
154b0 2a 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74  *.  ** We want t
154c0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
154d0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
154e0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
154f0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
15500 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
15510 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
15520 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
15530 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
15540 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
15550 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
15560 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
15570 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
15580 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
15590 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
155a0 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
155b0 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
155c0 29 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65  )) & 7;.  pSpace
155d0 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70   += nOff;.  szSp
155e0 61 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e  ace -= nOff;.  n
155f0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
15600 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
15610 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
15620 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
15630 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
15640 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
15650 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
15660 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
15670 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
15680 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
15690 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
156a0 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
156b0 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
156c0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
156d0 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
156e0 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
156f0 52 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a  Record*)pSpace;.
15700 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
15710 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
15720 54 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  TROY;.  }.  p->p
15730 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
15740 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
15750 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
15760 6c 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65  ld + 1;.  p->aMe
15770 6d 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a  m = pMem = (Mem*
15780 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
15790 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
157a0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
157b0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
157c0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
157d0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
157e0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
157f0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
15800 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
15810 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
15820 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
15830 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
15840 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
15850 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
15860 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
15870 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
15880 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
15890 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
158a0 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
158b0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
158c0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
158d0 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
158e0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
158f0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
15900 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
15910 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
15920 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
15930 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
15940 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
15950 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
15960 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
15970 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
15980 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72  eld = u;.  retur
15990 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f  n (void*)p;.}../
159a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
159b0 65 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70  e destroys a Unp
159c0 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65  ackedRecord obje
159d0 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
159e0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
159f0 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61  ackedRecord(Unpa
15a00 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
15a10 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
15a20 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pMem;..  assert(
15a30 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
15a40 74 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  t( p->flags & UN
15a50 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15a60 52 4f 59 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ROY );.  for(i=0
15a70 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20  , pMem=p->aMem; 
15a80 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  i<p->nField; i++
15a90 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f  , pMem++){.    /
15aa0 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
15ab0 65 63 6f 72 64 20 69 73 20 61 6c 77 61 79 73 20  ecord is always 
15ac0 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
15ad0 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
15ae0 33 56 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72  3VdbeUnpackRecor
15af0 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  d() function abo
15b00 76 65 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20  ve, which makes 
15b10 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  all.    ** strin
15b20 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 73 74 61  gs and blobs sta
15b30 74 69 63 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f  tic.  And none o
15b40 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 61  f the elements a
15b50 72 65 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 74  re.    ** ever t
15b60 72 61 6e 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74  ransformed, so t
15b70 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
15b80 79 74 68 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  ything to delete
15b90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15ba0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
15bb0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
15bc0 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
15bd0 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  }.  if( p->flags
15be0 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   & UNPACKED_NEED
15bf0 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71 6c  _FREE ){.    sql
15c00 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70 4b  ite3DbFree(p->pK
15c10 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a  eyInfo->db, p);.
15c20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
15c30 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
15c40 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
15c50 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
15c60 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
15c70 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
15c80 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
15c90 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
15ca0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
15cb0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
15cc0 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
15cd0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
15ce0 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
15cf0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
15d00 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
15d10 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
15d20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
15d30 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
15d40 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
15d50 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
15d60 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
15d70 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
15d80 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
15d90 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
15da0 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
15db0 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
15dc0 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
15dd0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
15de0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
15df0 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
15e00 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
15e10 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
15e20 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
15e30 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
15e40 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
15e50 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
15e60 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
15e70 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
15e80 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
15e90 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
15ea0 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
15eb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
15ec0 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
15ed0 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
15ee0 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
15ef0 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
15f00 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
15f10 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
15f20 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
15f30 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
15f40 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
15f50 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
15f60 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
15f70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e  .**.** If the UN
15f80 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
15f90 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c  WID flag is set,
15fa0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62   then the last b
15fb0 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65  yte of.** the he
15fc0 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73  ader of pKey1 is
15fd0 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73   ignored.  It is
15fe0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b   assumed that pK
15ff0 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64  ey1 is.** an ind
16000 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73  ex key, and thus
16010 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77   ends with a row
16020 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c  id value.  The l
16030 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  ast byte.** of t
16040 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74  he header will t
16050 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20  herefore be the 
16060 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  serial type of t
16070 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65  he rowid:.** one
16080 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   of 1, 2, 3, 4, 
16090 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20  5, 6, 8, or 9 - 
160a0 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69  the integer seri
160b0 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65  al types..** The
160c0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
160d0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
160e0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
160f0 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
16100 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69   By ignoring thi
16110 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74  s last byte of t
16120 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f  he header, we fo
16130 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  rce the comparis
16140 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  on.** to ignore 
16150 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
16160 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f   end of key1..*/
16170 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16180 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
16190 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
161a0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
161b0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
161c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
161d0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
161e0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
161f0 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20  .  int d1;      
16200 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16210 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
16220 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
16230 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
16240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
16250 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
16260 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
16270 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
16280 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
16290 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
162a0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
162b0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
162c0 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
162d0 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
162e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
162f0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
16300 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
16310 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
16320 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
16330 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
16340 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
16350 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  nfo;.  mem1.enc 
16360 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
16370 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
16380 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
16390 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
163a0 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
163b0 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
163c0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
163d0 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
163e0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
163f0 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
16400 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
16410 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
16420 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
16430 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
16440 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
16450 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
16460 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
16470 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
16480 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
16490 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
164a0 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
164b0 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
164c0 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
164d0 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
164e0 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c 69 7a  e used initializ
164f0 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
16500 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
16510 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
16520 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
16530 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
16540 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
16550 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
16560 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
16570 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
16580 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
16590 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
165a0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
165b0 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
165c0 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
165d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
165e0 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
165f0 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
16600 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
16610 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
16620 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
16630 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
16640 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
16650 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
16660 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  1;.  if( pPKey2-
16670 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
16680 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
16690 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a  {.    szHdr1--;.
166a0 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70    }.  nField = p
166b0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
166c0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
166d0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
166e0 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
166f0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
16700 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
16710 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
16720 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
16730 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
16740 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
16750 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
16760 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
16770 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
16780 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
16790 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
167a0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
167b0 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
167c0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
167d0 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
167e0 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
167f0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
16800 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16810 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
16820 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
16830 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
16840 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
16850 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
16860 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
16870 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
16880 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20       i<nField ? 
168b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
168c0 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
168d0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
168e0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
168f0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
16900 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
16910 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e   */..      /* In
16920 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
16930 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  if we are using 
16940 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
16950 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
16960 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
16970 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20 26  er && i<nField &
16980 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
16990 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
169a0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
169b0 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
169c0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45 46    /* If the PREF
169d0 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 69  IX_SEARCH flag i
169e0 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66 69  s set and all fi
169f0 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65 20  elds except the 
16a00 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72  final.      ** r
16a10 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65 20  owid field were 
16a20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61  equal, then clea
16a30 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41  r the PREFIX_SEA
16a40 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65 74  RCH flag and set
16a50 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65 79   .      ** pPKey
16a60 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 20  2->rowid to the 
16a70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
16a80 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b 65  id field in (pKe
16a90 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20  y1, nKey1)..    
16aa0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
16ab0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e  d by the OP_IsUn
16ac0 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20  ique opcode..   
16ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16ae0 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26  (pPKey2->flags &
16af0 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
16b00 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d 28  _SEARCH) && i==(
16b10 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31  pPKey2->nField-1
16b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
16b30 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 72  ert( idx1==szHdr
16b40 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20 20  1 && rc );.     
16b50 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
16b60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
16b70 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79  );.        pPKey
16b80 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50  2->flags &= ~UNP
16b90 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41  ACKED_PREFIX_SEA
16ba0 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50 4b  RCH;.        pPK
16bb0 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d  ey2->rowid = mem
16bc0 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  1.u.i;.      }. 
16bd0 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e     .      return
16be0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
16bf0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ++;.  }..  /* No
16c00 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
16c10 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
16c20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
16c30 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
16c40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
16c50 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
16c60 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
16c70 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
16c80 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
16c90 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
16ca0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
16cb0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
16cc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16cd0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
16ce0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
16cf0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
16d00 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
16d10 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
16d20 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
16d30 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
16d40 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
16d50 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50  qual. If the UNP
16d60 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20  ACKED_INCRKEY.  
16d70 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ** flag is set, 
16d80 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74  then break the t
16d90 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b  ie by treating k
16da0 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ey2 as larger.. 
16db0 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b   ** If the UPACK
16dc0 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
16dd0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
16de0 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d  n keys with comm
16df0 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a 2a  on prefixes.  **
16e00 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
16e10 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74  to be equal.  Ot
16e20 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e  herwise, the lon
16e30 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a  ger key is the .
16e40 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41 73    ** larger.  As
16e50 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65   it happens, the
16e60 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77   pPKey2 will alw
16e70 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67 65  ays be the longe
16e80 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20  r.  ** if there 
16e90 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e  is a difference.
16ea0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16eb0 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc==0 );.  if( p
16ec0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
16ed0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16ee0 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  ){.    rc = -1;.
16ef0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
16f00 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
16f10 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
16f20 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76  H ){.    /* Leav
16f30 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c  e rc==0 */.  }el
16f40 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64  se if( idx1<szHd
16f50 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  r1 ){.    rc = 1
16f60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16f70 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  c;.}. ../*.** pC
16f80 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
16f90 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
16fa0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
16fb0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
16fc0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
16fd0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
16fe0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
16ff0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
17000 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
17010 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17020 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
17030 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
17040 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
17050 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
17060 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
17070 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
17080 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
170a0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
170b0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
170c0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
170d0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
170e0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
170f0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
17100 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
17110 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
17120 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
17130 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
17140 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
17150 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
17160 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
17170 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
17180 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
17190 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
171a0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
171b0 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
171c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
171d0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
171e0 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  , v;..  UNUSED_P
171f0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20  ARAMETER(db);.. 
17200 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
17210 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17220 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
17230 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
17240 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
17250 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
17260 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
17270 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
17280 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
17290 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
172a0 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
172b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
172c0 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
172d0 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
172e0 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
172f0 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
17300 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
17310 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
17320 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17330 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
17340 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
17350 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
17360 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
17370 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
17380 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
17390 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
173a0 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
173b0 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
173c0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
173d0 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
173e0 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
173f0 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
17400 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
17410 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
17420 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
17430 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20  */.  memset(&m, 
17440 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
17450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
17460 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
17470 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  ur, 0, (int)nCel
17480 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
17490 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
174a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
174b0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
174c0 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
174d0 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
174e0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
174f0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
17500 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
17510 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
17520 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
17530 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
17540 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
17550 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
17560 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
17570 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
17580 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
17590 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
175a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
175b0 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
175c0 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
175d0 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
175e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
175f0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
17600 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
17610 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
17620 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
17630 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
17640 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
17650 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
17660 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17670 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
17680 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
17690 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
176a0 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
176b0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
176c0 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
176d0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
176e0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
176f0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
17700 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
17710 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
17720 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
17730 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
17740 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
17750 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
17760 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
17770 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
17780 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
17790 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
177a0 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
177b0 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
177c0 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
177d0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
177e0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
177f0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
17800 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
17810 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
17820 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
17830 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
17840 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
17850 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
17860 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
17870 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
17880 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
17890 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
178a0 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
178b0 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
178c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
178d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
178e0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
178f0 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
17900 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17910 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
17920 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
17930 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
17940 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
17950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17960 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
17970 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
17980 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61   testcase( m.zMa
17990 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
179a0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
179b0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
179c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
179d0 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
179e0 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
179f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
17a00 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
17a10 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
17a20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
17a30 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
17a40 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
17a50 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
17a60 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
17a70 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
17a80 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
17a90 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
17aa0 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
17ab0 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
17ac0 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
17ad0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
17ae0 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
17af0 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
17b00 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
17b10 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
17b20 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
17b30 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
17b40 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
17b50 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
17b60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
17b70 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
17b80 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
17b90 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
17ba0 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
17bb0 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
17bc0 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
17bd0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
17be0 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
17bf0 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
17c00 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17c10 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
17c20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c40 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
17c50 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
17c60 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17c70 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f  d *pUnpacked,  /
17c80 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
17c90 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d  on of key to com
17ca0 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
17cb0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17cd0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
17ce0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
17cf0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
17d00 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
17d10 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
17d20 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
17d30 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
17d40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17d50 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
17d60 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  lid(pCur) );.  r
17d70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17d80 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
17d90 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
17da0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
17db0 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20  K );    /* pCur 
17dc0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
17dd0 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
17de0 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e  t fail */.  /* n
17df0 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
17e00 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
17e10 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
17e20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73  because of the s
17e30 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
17e40 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
17e50 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
17e60 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
17e70 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
17e80 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
17e90 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
17ea0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
17eb0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
17ec0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17ed0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d  _BKPT;.  }.  mem
17ee0 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f  set(&m, 0, sizeo
17ef0 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  f(m));.  rc = sq
17f00 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
17f10 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
17f20 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
17f30 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
17f40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
17f50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
17f60 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d  sert( pUnpacked-
17f70 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17f80 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
17f90 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  ;.  *res = sqlit
17fa0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
17fb0 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
17fc0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
17fd0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17fe0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
17ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18010 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
18020 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
18030 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
18040 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
18050 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
18060 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
18070 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
18080 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
18090 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
180a0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
180b0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
180c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
180d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
180e0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
180f0 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
18100 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
18110 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
18120 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
18130 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
18140 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
18150 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
18160 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
18170 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
18180 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
18190 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
181a0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
181b0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
181c0 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
181d0 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
181e0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
181f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18200 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
18210 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
18220 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
18230 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
18240 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
18250 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
18260 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
18270 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
18280 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
18290 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
182a0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
182b0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
182c0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
182d0 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
182e0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
182f0 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
18300 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
18310 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
18320 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
18330 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
18340 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
18350 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
18360 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
18370 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
18380 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
18390 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
183a0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
183b0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
183c0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
183d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
183e0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
183f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
18400 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
18410 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
18420 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
18430 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
18440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
18460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
18470 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
18480 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75  ng the value bou
18490 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
184a0 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78  iVar of VM v. Ex
184b0 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c  cept, if the val
184c0 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c  ue is an SQL NUL
184d0 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20  L, return .** 0 
184e0 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20  instead. Unless 
184f0 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c  it is NULL, appl
18500 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28  y affinity aff (
18510 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
18520 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74  E_AFF_*.** const
18530 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c  ants) to the val
18540 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
18550 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ing it..**.** Th
18560 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
18570 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
18580 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
18590 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ng sqlite3ValueF
185a0 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ree()..*/.sqlite
185b0 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
185c0 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64 62  VdbeGetValue(Vdb
185d0 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
185e0 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
185f0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
18600 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
18610 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
18620 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
18630 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
18640 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
18650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
18660 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
18670 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
18680 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
18690 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
186a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
186b0 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
186c0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
186d0 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
186e0 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
186f0 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
18700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18710 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
18720 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20  ((Mem *)pRet);. 
18730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
18740 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
18750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
18770 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
18780 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
18790 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
187a0 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
187b0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
187c0 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
187d0 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
187e0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
187f0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
18800 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
18810 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18820 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
18830 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
18840 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
18850 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
18860 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
18870 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
18880 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
18890 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
188a0 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
188b0 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  1));.  }.}..#ifd
188c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
188d0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
188e0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
188f0 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
18900 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
18910 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
18920 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c   pre-update call
18930 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72  ,.** then cursor
18940 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
18950 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
18960 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74  hould point to t
18970 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20  he row about.** 
18980 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20  to be update or 
18990 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20  deleted. If the 
189a0 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c  application call
189b0 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  s sqlite3_preupd
189c0 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68  ate_old(),.** th
189d0 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65  e required value
189e0 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
189f0 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  om the row the c
18a00 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e  ursor points to.
18a10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18a20 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f  VdbePreUpdateHoo
18a30 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  k(.  Vdbe *v,   
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65       /* Vdbe pre
18a60 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20  -update hook is 
18a70 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20  invoked by */.  
18a80 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
18a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18aa0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61  /* Cursor to gra
18ab0 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66  b old.* values f
18ac0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  rom */.  int op,
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
18af0 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54  TE_INSERT, UPDAT
18b00 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
18b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
18b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
18b40 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
18b50 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
18b60 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
18b70 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36  ed table */.  i6
18b80 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20  4 iKey1,        
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ba0 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c   Initial key val
18bb0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  ue */.  int iReg
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18be0 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65  ter for new.* re
18bf0 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  cord */.){.  sql
18c00 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62  ite3 *db = v->db
18c10 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20  ;.  i64 iKey2;. 
18c20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70   PreUpdate preup
18c30 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  date;.  const ch
18c40 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d  ar *zTbl = pTab-
18c50 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72  >zName;..  asser
18c60 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
18c70 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
18c80 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
18c90 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
18ca0 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51  ));.  if( op==SQ
18cb0 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20  LITE_UPDATE ){. 
18cc0 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
18cd0 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
18ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32  }else{.    iKey2
18cf0 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20   = iKey1;.  }.. 
18d00 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
18d10 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
18d20 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
18d30 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
18d40 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
18d50 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
18d60 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
18d70 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
18d80 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
18d90 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
18da0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
18db0 6e 46 69 65 6c 64 20 3d 20 70 43 73 72 2d 3e 6e  nField = pCsr->n
18dc0 46 69 65 6c 64 3b 0a 20 20 70 72 65 75 70 64 61  Field;.  preupda
18dd0 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31  te.iKey1 = iKey1
18de0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
18df0 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70  ey2 = iKey2;.  p
18e00 72 65 75 70 64 61 74 65 2e 69 50 4b 65 79 20 3d  reupdate.iPKey =
18e10 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20   pTab->iPKey;.. 
18e20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
18e30 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20  = &preupdate;.  
18e40 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
18e50 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55  llback(db->pPreU
18e60 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70  pdateArg, db, op
18e70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65  , zDb, zTbl, iKe
18e80 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62  y1, iKey2);.  db
18e90 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 30  ->pPreUpdate = 0
18ea0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
18eb0 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  e(db, preupdate.
18ec0 61 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20  aRecord);.  if( 
18ed0 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63  preupdate.pUnpac
18ee0 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ked ){.    sqlit
18ef0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
18f00 63 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75 70  ckedRecord(preup
18f10 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b  date.pUnpacked);
18f20 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 75 70  .  }.  if( preup
18f30 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
18f40 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
18f50 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
18f60 65 64 52 65 63 6f 72 64 28 70 72 65 75 70 64 61  edRecord(preupda
18f70 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29  te.pNewUnpacked)
18f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 75  ;.  }.  if( preu
18f90 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20  pdate.aNew ){.  
18fa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
18fb0 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46  (i=0; i<pCsr->nF
18fc0 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
18fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18fe0 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61  Release(&preupda
18ff0 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  te.aNew[i]);.   
19000 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
19010 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
19020 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a  te.aNew);.  }.}.
19030 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19040 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
19050 45 5f 48 4f 4f 4b 20 2a 2f 0a                    E_HOOK */.