/ Hex Artifact Content
Login

Artifact 2803275ce14795549fd86a03474cac80f549a569:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65  pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e  *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76  g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54  oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49  race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d  LE *trace){.  p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a  >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74   one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a  han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63  nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64  y(Vdbe *p){.  Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70  t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30  loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b  24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73  , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66  izeof(Op));.  if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d  ( pNew ){.    p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a  p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e  eof(Op);.    p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70  {.    if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
0f60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0f70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0f80: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
0f90: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
0fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
0fb0: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
0fc0: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  p[i]);.#endif.#i
0fd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
0fe0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
0ff0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1000: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1010: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1030: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1040: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1060: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1080: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
1090: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
10a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10b0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
10c0: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
10d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
10e0: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
10f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1100: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1120: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1130: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   0);.}.../*.** A
1140: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
1150: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
1160: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69  4 value as a poi
1170: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1190: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
11b0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
11c0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11e0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
11f0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1220: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
1230: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
1240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1260: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
1270: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1280: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP4,    /* The P
1290: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
12a0: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
12b0: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
12c0: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
12d0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
12e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12f0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1310: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP4(p, addr, zP
1320: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65  4, p4type);.  re
1330: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1340: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
1350: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
1360: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1370: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
1380: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1390: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
13a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
13b0: 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
13c0: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
13d0: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
13e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
13f0: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
1400: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1410: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
1420: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
1430: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
1440: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
1450: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
1460: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
1470: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1480: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
1490: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
14a0: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
14b0: 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d   j;.  int addr =
14c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d0: 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(p, OP_ParseSc
14e0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29  hema, iDb, 0, 0)
14f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1500: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1510: 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41   zWhere, P4_DYNA
1520: 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  MIC);.  for(j=0;
1530: 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a   j<p->db->nDb; j
1540: 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55  ++) sqlite3VdbeU
1550: 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a  sesBtree(p, j);.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1570: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1580: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1590: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  e as an integer.
15a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15b0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
15c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
15d0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
15e0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
15f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1610: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1620: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1630: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1640: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1650: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1660: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1670: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1690: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
16a0: 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20    int p4        
16b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
16c0: 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e  operand as an in
16d0: 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  teger */.){.  in
16e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
16f0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1700: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1720: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51  geP4(p, addr, SQ
1730: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1740: 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  p4), P4_INT32);.
1750: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1760: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1770: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
1780: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
1790: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
17a0: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
17b0: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
17c0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
17d0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
17e0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
17f0: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
1800: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
1810: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
1820: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
1830: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
1840: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
1850: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
1860: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
1870: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
1880: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
1890: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
18a0: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
18b0: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
18c0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
18d0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
18e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
18f0: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
1900: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1910: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
1920: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
1930: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
1940: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
1950: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
1960: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
1970: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
1980: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
1990: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
19a0: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
19b0: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
19c0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
19d0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
19e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19f0: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
1a00: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
1a10: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
1a20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1a30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
1a40: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
1a50: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
1a60: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1a70: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1a80: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
1ac0: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
1ad0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
1ae0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1af0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
1b00: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1b10: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1b20: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1b30: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1b40: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1b50: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1b60: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1b70: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1b80: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1b90: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1ba0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1bc0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1be0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1bf0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1c00: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1c10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1c20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1c30: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1c40: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1c50: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1c60: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1c70: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1c80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
1c90: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
1ca0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
1cb0: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
1cc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cd0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
1ce0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
1cf0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
1d00: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1d10: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
1d20: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1d30: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
1d40: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d50: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
1d60: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
1d70: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1d80: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
1d90: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
1da0: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
1db0: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
1dc0: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
1dd0: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
1de0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
1df0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
1e00: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
1e10: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
1e20: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
1e30: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
1e40: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
1e50: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
1e60: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
1e70: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
1ea0: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
1eb0: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
1ec0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
1ed0: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
1ee0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
1ef0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
1f00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
1f10: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
1f20: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
1f30: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
1f40: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
1f50: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
1f60: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
1f90: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1fa0: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
1fb0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
1fc0: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
1fd0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
1fe0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
1ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2000: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2010: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
2020: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2050: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2060: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
2070: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
2090: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
20a0: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
20b0: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
20c0: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
20d0: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
20e0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
20f0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
2100: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
2110: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
2120: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
2130: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
2140: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
2150: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
2160: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2170: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
2180: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
2190: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
21a0: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
21b0: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
21c0: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
21d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21e0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
21f0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
2200: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
2210: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
2220: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
2230: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
2240: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
2250: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
2260: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
2270: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
2280: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
2290: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
22a0: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
22b0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
22c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
22d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
22e0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
22f0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
2300: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
2310: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
2320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2330: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
2340: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
2350: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2360: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
2370: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
2380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2390: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
23a0: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
23b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23c0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
23d0: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
23e0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
23f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2400: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2410: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2420: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2430: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
2440: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
2450: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
2460: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
2470: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
2480: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
2490: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
24a0: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
24b0: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
24c0: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
24d0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
24e0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
24f0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
2500: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
2510: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
2520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2530: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2540: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2550: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2560: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2570: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
2580: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
2590: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
25a0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
25b0: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
25c0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
25d0: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
25e0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
25f0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
2600: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
2610: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2620: 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54  straint).**.** T
2630: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
2640: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
2650: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
2660: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
2670: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
2680: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2690: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
26a0: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
26b0: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
26c0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
26d0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
26e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
26f0: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
2700: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
2710: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
2720: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
2730: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
2740: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2750: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
2760: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
2770: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
2780: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
2790: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
27a0: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
27b0: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
27c0: 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ort = 0;.  Op *p
27d0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
27e0: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
27f0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
2800: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
2810: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
2820: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2830: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
2840: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
2850: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
2860: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
2870: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
2880: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
2890: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
28a0: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e  OP_VRename .#ifn
28b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28c0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
28d0: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
28e0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
28f0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
2900: 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20  p2==1) .#endif. 
2910: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
2920: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
2930: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
2940: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70 4f  l) .      && (pO
2950: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
2960: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
2970: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
2980: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
2990: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
29a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
29b0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
29c0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
29d0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
29e0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
29f0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
2a00: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
2a10: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
2a20: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2a30: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2a40: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2a50: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2a60: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2a70: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2a80: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2a90: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2aa0: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2ab0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
2ac0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
2ad0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
2ae0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
2af0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
2b00: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
2b10: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2b20: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2b30: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2b40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b50: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2b60: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2b70: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2b80: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2b90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2ba0: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2bb0: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2bc0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2bd0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2be0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2bf0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2c00: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2c10: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2c20: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2c30: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2c40: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2c50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2c70: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2c80: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2c90: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2ca0: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2cb0: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2cc0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2cd0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2ce0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2cf0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2d00: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2d10: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2d20: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2d30: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2d40: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2d50: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2d60: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2d70: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2d80: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2d90: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2da0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2db0: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2dc0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2dd0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2de0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2df0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2e00: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2e10: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2e20: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2e30: 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70  y = 1;.  for(pOp
2e40: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2e50: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2e60: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2e70: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2e80: 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f  ode;..    pOp->o
2e90: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
2ea0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
2eb0: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
2ec0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2ed0: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2ee0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
2ef0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
2f00: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2f10: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
2f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 63    }else if( (opc
2f30: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2f40: 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d  ion && pOp->p2!=
2f50: 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  0) || opcode==OP
2f60: 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  _Vacuum ){.     
2f70: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2f80: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2f90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2fa0: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2fb0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2fc0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
2fd0: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
2fe0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ff0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73  Op->p2;.    }els
3000: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
3010: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
3020: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
3030: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
3040: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
3050: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
3060: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
3070: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
3080: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
3090: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
30a0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
30b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
30c0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
30d0: 5f 4e 65 78 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Next || opcode=
30e0: 3d 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 20 29  =OP_SorterNext )
30f0: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3100: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3110: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3120: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3130: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
3140: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3150: 65 3d 3d 4f 50 5f 50 72 65 76 20 29 7b 0a 20 20  e==OP_Prev ){.  
3160: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3170: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3180: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
3190: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
31a0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
31b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
31c0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
31d0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
31e0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
31f0: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3200: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
3210: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3220: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3230: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3250: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
3260: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
3270: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
3280: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
3290: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32a0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
32b0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
32c0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
32d0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
32e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
32f0: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3300: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3310: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3320: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3330: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3340: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3350: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
3360: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
3370: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
3380: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
3390: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
33a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
33b0: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
33c0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
33d0: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
33e0: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
33f0: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3400: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3410: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3420: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3430: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3440: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
3450: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
3460: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
3470: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
3480: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
3490: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
34a0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
34b0: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
34c0: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
34d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
34e0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
34f0: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3500: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3510: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3520: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3530: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3540: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
3550: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
3560: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
3570: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
3580: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
3590: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
35a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
35b0: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
35c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
35d0: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
35e0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
35f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3600: 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  rt( p->btreeMask
3610: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  ==0 );..  resolv
3620: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
3630: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
3640: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
3650: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
3660: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
3670: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
3680: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
3690: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
36a0: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
36b0: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
36c0: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
36d0: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
36e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
36f0: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
3700: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
3710: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
3720: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3730: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3740: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3750: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3760: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
3770: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3780: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3790: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
37a0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
37b0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
37c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
37d0: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
37e0: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
37f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3800: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3810: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3820: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3830: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3840: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3850: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3860: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3870: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
3880: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3890: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71   if( p2<0 && (sq
38a0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
38b0: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
38c0: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
38d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
38e0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
38f0: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3910: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3920: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
3930: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
3940: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
3950: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3960: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
3970: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
3980: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
3990: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
39a0: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
39b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
39c0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
39d0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
39e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
39f0: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3a00: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3a10: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3a20: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3a30: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
3a40: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
3a50: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a60: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3a70: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
3a80: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3a90: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3aa0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3ab0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3ac0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3ad0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3ae0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3af0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3b00: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3b10: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3b20: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3b30: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3b40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b50: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
3b60: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3b70: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3b80: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3b90: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3ba0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3bb0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
3bc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3bd0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3be0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3bf0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3c00: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3c10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3c20: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3c30: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3c40: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3c50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3c60: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3c70: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3c80: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3c90: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3ca0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3cb0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3cc0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3cd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3ce0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3cf0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3d00: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3d10: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3d30: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
3d40: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3d50: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3d60: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
3d70: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
3d80: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
3d90: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3da0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3db0: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
3dc0: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
3dd0: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
3de0: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
3df0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3e00: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
3e10: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
3e20: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3e30: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
3e40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3e50: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
3e60: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
3e70: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3e80: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
3e90: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
3ea0: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
3eb0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
3ec0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
3ed0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ee0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
3ef0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
3f00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3f10: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
3f20: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3f30: 61 64 64 72 3e 3d 30 20 7c 7c 20 70 2d 3e 64 62  addr>=0 || p->db
3f40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3f50: 3b 0a 20 20 69 66 28 20 61 64 64 72 3e 3d 30 20  ;.  if( addr>=0 
3f60: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
3f70: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3f80: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3f90: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3fa0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3fb0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3fc0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3fd0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3fe0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3ff0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
4000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4010: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4020: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
4030: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
4040: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
4050: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
4060: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
4070: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
4080: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4090: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
40a0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
40b0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
40c0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
40d0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
40e0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
40f0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
4100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4110: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
4120: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
4130: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
4140: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
4150: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
4160: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
4170: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
4180: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4190: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
41a0: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
41b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
41c0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
41d0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
41e0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
41f0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
4200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4210: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4230: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4240: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4250: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4260: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
4280: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
42a0: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
42b0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
42c0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
42d0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
42e0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
42f0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
4300: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4310: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4320: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4330: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4340: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4350: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4370: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4380: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4390: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
43a0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
43b0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
43c0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
43d0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
43e0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
43f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4400: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4410: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4420: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4440: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4450: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4460: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4470: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4480: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
44a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
44b0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
44c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44d0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
44e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
44f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4500: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4510: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4520: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4530: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4540: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4550: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4560: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4570: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4580: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4590: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
45a0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
45b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
45c0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
45d0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
45e0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
45f0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4600: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4610: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4630: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4640: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4650: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4660: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4670: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4680: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4690: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
46a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
46b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
46c0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
46d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
46e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
46f0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
4700: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4710: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4720: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4730: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4740: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4750: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4760: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
4770: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
4780: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4790: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
47a0: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
47b0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
47c0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
47d0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
47e0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
47f0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
4800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4810: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4820: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4830: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4840: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4850: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4860: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
4870: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
4880: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
4890: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
48a0: 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  op.*/.void sqlit
48b0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
48c0: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
48d0: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  addr){.  if( p->
48e0: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
48f0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4900: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4910: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4920: 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20  .    freeP4(db, 
4930: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4940: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d  ->p4.p);.    mem
4950: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
4960: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
4970: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
4980: 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  P_Noop;.  }.}../
4990: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
49a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
49b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
49c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
49d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
49e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
49f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
4a00: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
4a10: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
4a20: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
4a30: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
4a40: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
4a50: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
4a60: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
4a70: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
4a80: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
4a90: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
4aa0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
4ab0: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
4ac0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
4ad0: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
4ae0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4af0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4b00: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
4b10: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
4b20: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
4b30: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
4b40: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
4b50: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
4b60: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
4b70: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a  tes of zP4..**.*
4b80: 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  * If n==P4_KEYIN
4b90: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
4ba0: 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   zP4 is a pointe
4bb0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
4bc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
4bd0: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
4be0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
4bf0: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
4c00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
4c10: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
4c20: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
4c30: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
4c40: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
4c50: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4c60: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
4c70: 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  t zP4 points to 
4c80: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4c90: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
4ca0: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
4cb0: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
4cc0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cd0: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
4ce0: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
4cf0: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
4d00: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
4d10: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
4d20: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
4d30: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
4d40: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
4d50: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
4d60: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
4d70: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
4d80: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
4d90: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
4da0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
4db0: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
4dc0: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
4dd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
4de0: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
4df0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
4e00: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
4e10: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
4e20: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
4e30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
4e40: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
4e50: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4e70: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
4e80: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
4e90: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
4ea0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
4eb0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
4ec0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
4ed0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
4ee0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4ef0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4f00: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
4f10: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4f20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
4f30: 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26   n!=P4_KEYINFO &
4f40: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b  & n!=P4_VTAB ) {
4f50: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f60: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
4f70: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
4f80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
4f90: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
4fa0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4fb0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
4fc0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
4fd0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
4fe0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
4ff0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5000: 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20  ];.  freeP4(db, 
5010: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
5020: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
5030: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  p4.p = 0;.  if( 
5040: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
5050: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
5060: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
5070: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
5080: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
5090: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
50a0: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
50b0: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
50c0: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
50d0: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
50e0: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
50f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5100: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
5110: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
5120: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
5130: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5140: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5150: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5160: 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
5170: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
5180: 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65  fo;.    int nFie
5190: 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  ld, nByte;..    
51a0: 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e  nField = ((KeyIn
51b0: 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64  fo*)zP4)->nField
51c0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
51d0: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20  zeof(*pKeyInfo) 
51e0: 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a  + (nField-1)*siz
51f0: 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  eof(pKeyInfo->aC
5200: 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64  oll[0]) + nField
5210: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
5220: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5230: 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20  Raw(0, nByte);. 
5240: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
5250: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
5260: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
5270: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53   ){.      u8 *aS
5280: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
5290: 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b  memcpy((char*)pK
52a0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
52b0: 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20  te - nField);.  
52c0: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
52d0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
52e0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
52f0: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
5300: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
5310: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5320: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
5330: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
5340: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
5350: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
5360: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
5370: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
5380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5390: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
53a0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
53b0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
53c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
53d0: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
53e0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
53f0: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
5400: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
5410: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5430: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5440: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5450: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
5460: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
5470: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5480: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5490: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
54a0: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
54b0: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
54c0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
54d0: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
54e0: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
54f0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
5500: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
5510: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5520: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5530: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
5540: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
5550: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
5560: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5570: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
5580: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
5590: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
55a0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
55b0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
55c0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
55d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
55e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
55f0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
5600: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5610: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
5620: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
5630: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
5640: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
5650: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
5660: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
5670: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
5680: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
5690: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
56a0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
56b0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
56c0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
56d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56e0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
56f0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5700: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
5710: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
5720: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
5730: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
5740: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
5750: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
5760: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
5770: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
5780: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
5790: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
57a0: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
57b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
57c0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
57d0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
57e0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
57f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5800: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
5810: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5820: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5840: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5860: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5870: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5880: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
5890: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
58a0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
58b0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
58c0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
58d0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
58e0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
58f0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5900: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5910: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5920: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
5930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5940: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
5950: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
5960: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5970: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
5980: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5990: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
59a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
59b0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
59c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
59d0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
59e0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
59f0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
5a00: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
5a10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5a20: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
5a30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
5a40: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5a50: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5a60: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
5a70: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
5a80: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
5a90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
5aa0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
5ab0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
5ac0: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
5ad0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
5ae0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
5af0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
5b00: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
5b10: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
5b20: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
5b30: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
5b40: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
5b50: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
5b60: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5b70: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
5b80: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
5b90: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
5ba0: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
5bb0: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5bc0: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
5bd0: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
5be0: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
5bf0: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
5c00: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
5c10: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
5c20: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
5c30: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
5c40: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
5c50: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20  nd..**.** About 
5c60: 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49 54  the #ifdef SQLIT
5c70: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e  E_OMIT_TRACE:  N
5c80: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  ormally, this ro
5c90: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
5ca0: 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20  alled.** unless 
5cb0: 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20  p->nOp>0.  This 
5cc0: 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
5cd0: 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c  e absense of SQL
5ce0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a  ITE_OMIT_TRACE,.
5cf0: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69  ** an OP_Trace i
5d00: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
5d10: 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62 79  ways inserted by
5d20: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 28   sqlite3VdbeGet(
5d30: 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  ) as soon as.** 
5d40: 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63 72  a new VDBE is cr
5d50: 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72  eated.  So we ar
5d60: 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61 64  e free to set ad
5d70: 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77  dr to p->nOp-1 w
5d80: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5d90: 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   to double-check
5da0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5db0: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  at the result is
5dc0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42   non-negative. B
5dd0: 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ut.** if SQLITE_
5de0: 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64 65  OMIT_TRACE is de
5df0: 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72  fined, the OP_Tr
5e00: 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61  ace is omitted a
5e10: 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f  nd we do need to
5e20: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61  .** check the va
5e30: 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20  lue of p->nOp-1 
5e40: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
5e50: 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  g..*/.VdbeOp *sq
5e60: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
5e70: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5e80: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
5e90: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
5ea0: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
5eb0: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
5ec0: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
5ed0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
5ee0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
5ef0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
5f00: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
5f10: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
5f20: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
5f30: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
5f40: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
5f50: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
5f60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5f70: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5f80: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5f90: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5fb0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
5fc0: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
5fd0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
5fe0: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
5ff0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6000: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6010: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6020: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6030: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6040: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6050: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6060: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6070: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6080: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6090: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
60a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
60b0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
60c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
60d0: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
60e0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
60f0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
6100: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
6110: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6120: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6130: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
6140: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
6150: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
6160: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
6170: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
6180: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
6190: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
61a0: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
61b0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
61c0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
61d0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
61e0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
61f0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
6200: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
6210: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
6220: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
6230: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
6240: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6250: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
6260: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
6270: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
6280: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6290: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
62a0: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
62b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
62c0: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
62d0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
62e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
62f0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
6300: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
6310: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6320: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
6330: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
6340: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
6350: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
6370: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
6380: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6390: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
63a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
63b0: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
63c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
63d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
63e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
63f0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
6400: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
6410: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
6420: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
6430: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
6440: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
6450: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
6460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6470: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6480: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
6490: 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,n+1);.         
64a0: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
64b0: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
64c0: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
64d0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
64e0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a  p[i],",nil",4);.
64f0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
6500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6510: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
6520: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
6530: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
6540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
6550: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
6560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6570: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
6580: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
6590: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
65a0: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
65b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
65c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
65d0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
65e0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
65f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6600: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
6610: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
6620: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
6630: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
6640: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6650: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6660: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
6670: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
6680: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
6690: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
66a0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
66b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
66c0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
66d0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
66e0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
66f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6700: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
6710: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6720: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6730: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
6740: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
6750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6760: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
6770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6780: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6790: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
67a0: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
67b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
67c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
67d0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
67e0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
67f0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
6800: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6810: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
6820: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
6830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6840: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6850: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6860: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6870: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6880: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6890: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
68a0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
68b0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
68c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
68d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68e0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
68f0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
6900: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6910: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6930: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6940: 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22  p, zTemp, "NULL"
6950: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6960: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6970: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6980: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
6990: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
69a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
69c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
69d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
69e0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
69f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6a00: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
6a10: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
6a20: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
6a30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6a40: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
6a50: 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56  p:%p", pVtab, pV
6a60: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20  tab->pModule);. 
6a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6a90: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
6aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6ab0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6ac0: 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22  Temp, "intarray"
6ad0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ae0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6af0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
6b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6b10: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6b20: 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  emp, "program");
6b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6b50: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
6b60: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6b70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6b90: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
6ba0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
6bb0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
6bc0: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
6bd0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
6be0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
6bf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6c00: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
6c10: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
6c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
6c30: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
6c40: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
6c50: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
6c60: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
6c70: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
6c80: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
6c90: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
6ca0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
6cb0: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
6cc0: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
6cd0: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
6ce0: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
6cf0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
6d00: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
6d10: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
6d20: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
6d30: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
6d40: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
6d50: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
6d60: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
6d70: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
6d80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
6d90: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
6da0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
6db0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
6dc0: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
6dd0: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
6de0: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6df0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6e00: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6e10: 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  .  p->btreeMask 
6e20: 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
6e30: 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  <i;.  if( i!=1 &
6e40: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
6e50: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
6e60: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
6e70: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20   p->lockMask |= 
6e80: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6e90: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
6ea0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6eb0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
6ec0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
6ed0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
6ee0: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
6ef0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
6f00: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
6f10: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
6f20: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
6f30: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
6f40: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
6f50: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
6f60: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
6f70: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
6f80: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
6f90: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
6fa0: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
6fb0: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
6fc0: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
6fd0: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
6fe0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
6ff0: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
7000: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
7010: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
7020: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
7030: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
7040: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
7050: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
7060: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
7070: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
7080: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
7090: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
70a0: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
70b0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
70c0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
70d0: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
70e0: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
70f0: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
7100: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
7110: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
7120: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7130: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
7140: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
7150: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
7160: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
7170: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7180: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
7190: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
71a0: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
71b0: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
71c0: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
71d0: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
71e0: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
71f0: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
7200: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
7210: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
7220: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
7230: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
7240: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
7250: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
7260: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
7270: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
7280: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
7290: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
72a0: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
72b0: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
72c0: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
72d0: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
72e0: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
72f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
7300: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
7310: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7320: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
7330: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
7340: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
7350: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
7360: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
7370: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
7380: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
7390: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
73a0: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
73b0: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
73c0: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
73d0: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
73e0: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
73f0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
7400: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7420: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
7430: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
7440: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
7450: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7460: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
7470: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
7480: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
7490: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
74a0: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
74b0: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
74c0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
74d0: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nter()..*/.void 
74e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
74f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7500: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7510: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7520: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7530: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7540: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7550: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7560: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7570: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7580: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7590: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
75a0: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
75b0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
75c0: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
75d0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
75e0: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
75f0: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7600: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7620: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
7630: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7640: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
7650: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
7660: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
7670: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
7680: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
7690: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
76a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
76b0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
76c0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
76d0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
76e0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
76f0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
7700: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
7710: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
7720: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7730: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
7740: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
7750: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
7760: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
7770: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
7780: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
7790: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
77a0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
77b0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
77c0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
77d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
77e0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
77f0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
7800: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
7810: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
7820: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7830: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
7840: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
7850: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
7860: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
7870: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
7880: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
7890: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
78a0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
78b0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
78c0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
78d0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
78e0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
78f0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
7900: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
7910: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
7920: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c    u8 malloc_fail
7930: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
7940: 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64  ailed;.    if( d
7950: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
7960: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e  ){.      for(pEn
7970: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
7980: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   p++){.        s
7990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
79a0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
79b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
79c0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  rn;.    }.    fo
79d0: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
79e0: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
79f0: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
7a00: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
7a10: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
7a20: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
7a30: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
7a40: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
7a50: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
7a60: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
7a70: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
7a80: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
7a90: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
7aa0: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
7ab0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
7ac0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
7ad0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
7ae0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
7af0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
7b00: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
7b10: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
7b20: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
7b30: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
7b40: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
7b50: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
7b60: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
7b70: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
7b80: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
7b90: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
7ba0: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
7bb0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
7bc0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
7bd0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
7be0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
7bf0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
7c00: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
7c10: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
7c20: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
7c30: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
7c40: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
7c50: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
7c60: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
7c70: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
7c80: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
7c90: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
7ca0: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
7cb0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
7cc0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
7cd0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
7ce0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
7cf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7d00: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
7d10: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
7d20: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
7d30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7d40: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7d50: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
7d60: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f  se if( p->zMallo
7d70: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7d80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7d90: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
7da0: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d      p->zMalloc =
7db0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
7dc0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
7dd0: 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d  M_Invalid;.    }
7de0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
7df0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
7e00: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
7e10: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
7e20: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
7e30: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
7e40: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
7e50: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
7e60: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
7e70: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
7e80: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
7e90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7ea0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
7eb0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
7ec0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
7ed0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
7ee0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
7ef0: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
7f00: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
7f10: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
7f20: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
7f30: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
7f40: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
7f50: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
7f60: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
7f70: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
7f80: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
7f90: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
7fa0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
7fb0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
7fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7fd0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
7fe0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
7ff0: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
8000: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8010: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
8020: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
8030: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
8040: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
8050: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
8060: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
8070: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
8080: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
8090: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
80a0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
80b0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
80c0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
80d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
80e0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
80f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
8100: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
8110: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
8120: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
8130: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
8140: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
8150: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
8160: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
8170: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
8180: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
8190: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
81a0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
81b0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
81c0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
81d0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
81e0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
81f0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
8200: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8210: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
8220: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
8230: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
8240: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8260: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
8270: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
82a0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
82b0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
82c0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
82f0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
8300: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
8310: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
8320: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8330: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
8340: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
8350: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
8380: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
8390: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
83a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
83b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
83c0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
83d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
83e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8410: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
8420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8450: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
8460: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
8470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8480: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
8490: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
84a0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
84b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
84c0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
84d0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
84e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
84f0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
8500: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
8510: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8520: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
8530: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
8540: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
8550: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
8560: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
8570: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
8580: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
8590: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
85a0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
85b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
85c0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
85d0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
85e0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
85f0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
8600: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
8610: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
8620: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
8630: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8640: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
8650: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
8660: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
8670: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
8680: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
8690: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
86a0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
86b0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
86c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
86d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
86e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
86f0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
8700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
8710: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
8720: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
8730: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
8740: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
8750: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
8760: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
8770: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
8780: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
8790: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
87a0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
87b0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
87c0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
87d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
87e0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
87f0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
8800: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
8810: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
8820: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
8830: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
8840: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8850: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
8860: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
8870: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
8880: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
8890: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
88a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
88b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
88c0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
88d0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
88e0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
88f0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
8900: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
8910: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
8920: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
8930: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
8940: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
8950: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
8960: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
8970: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
8980: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
8990: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
89a0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
89b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
89c0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
89d0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
89e0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
89f0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
8a00: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
8a10: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8a20: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
8a30: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
8a40: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
8a50: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
8a60: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
8a70: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
8a80: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
8a90: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
8aa0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
8ab0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
8ac0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
8ad0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
8ae0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
8af0: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
8b00: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
8b10: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
8b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
8b30: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
8b40: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
8b50: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
8b60: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
8b70: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
8b80: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
8b90: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
8ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8bb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8bc0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
8bd0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
8be0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
8bf0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
8c00: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
8c10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8c20: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8c30: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
8c40: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
8c50: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
8c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
8c70: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
8c80: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
8c90: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
8ca0: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
8cb0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
8cc0: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
8cd0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
8ce0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
8cf0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
8d00: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8d10: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
8d20: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
8d30: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
8d40: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
8d50: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
8d60: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
8d70: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
8d80: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
8d90: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
8da0: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
8db0: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
8dc0: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
8dd0: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
8de0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
8df0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
8e00: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
8e10: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
8e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
8e30: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8e40: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e50: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
8e60: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8e70: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8e80: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
8e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
8ec0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
8ed0: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
8ee0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8ef0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
8f00: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
8f10: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
8f20: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8f30: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
8f40: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
8f50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
8f60: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
8f70: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
8f80: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
8f90: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
8fa0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
8fb0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
8fc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8fd0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
8fe0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8ff0: 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  an OP_Program op
9000: 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  code is encounte
9010: 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f  r (the only opco
9020: 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  de that has.    
9030: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
9040: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
9050: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
9060: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
9070: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
9080: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
9090: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
90a0: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
90b0: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
90c0: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
90d0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c     ** has not al
90e0: 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e  ready been seen.
90f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9100: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
9110: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
9120: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
9130: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
9140: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
9150: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
9160: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
9170: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
9180: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9190: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
91a0: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
91b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
91c0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
91d0: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
91e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
91f0: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
9200: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
9210: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
9220: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
9230: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
9240: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
9250: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
9260: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
9270: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
9280: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
9290: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
92a0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92c0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
92d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
92e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
92f0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
9320: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9330: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
9340: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
9350: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9360: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
9370: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
93a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
93b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
93c0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
93d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
93e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
93f0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
9400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
9420: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9430: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9440: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
9450: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
9460: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
9470: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
9480: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
9490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
94a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
94b0: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
94c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
94d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
94e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
94f0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
9500: 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c  m;.    z = displ
9510: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
9520: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
9530: 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  z!=pMem->z ){.  
9540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9550: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
9560: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
9570: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
9580: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9590: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
95a0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
95b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
95c0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
95d0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
95e0: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
95f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9600: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
9610: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
9620: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
9630: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9640: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
9650: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
9660: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9670: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9680: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
9690: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
96a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
96b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
96c0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
96d0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
96e0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
96f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9700: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
9710: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
9720: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
9730: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9740: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
9750: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9760: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
9770: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
9780: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9790: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
97a0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
97b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
97c0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
97d0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
97e0: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
97f0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9800: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
9810: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
9820: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9830: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9840: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
9850: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
9860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
9870: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
9880: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9890: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
98c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
98d0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
98e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98f0: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
9900: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
9910: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
9920: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
9930: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
9940: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9950: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9960: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
9970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9980: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9990: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
99a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
99b0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
99c0: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
99d0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
99e0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
99f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9a00: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
9a10: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
9a20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
9a30: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
9a40: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9a50: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9a60: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9a70: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
9a80: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
9a90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9aa0: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
9ab0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
9ac0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
9ad0: 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  z++;.    printf(
9ae0: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
9af0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
9b00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9b10: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
9b20: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9b30: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
9b40: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
9b50: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
9b60: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
9b70: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
9b80: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
9b90: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
9ba0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9bb0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9bc0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
9bd0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
9be0: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
9bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9c00: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9c10: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9c20: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9c30: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9c40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
9c50: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
9c60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9c70: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
9c80: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
9c90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
9ca0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9cb0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
9cc0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
9cd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9ce0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
9cf0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
9d00: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
9d10: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
9d20: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
9d30: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9d40: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
9d50: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
9d60: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
9d70: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
9d80: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
9d90: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9da0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9db0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
9dc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
9dd0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
9de0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
9df0: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
9e00: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
9e10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
9e20: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
9e30: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
9e40: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
9e50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
9e60: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
9e70: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
9e80: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
9e90: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
9ea0: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
9eb0: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
9ec0: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
9ed0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
9ee0: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
9ef0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
9f00: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
9f10: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
9f20: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
9f30: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
9f40: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
9f50: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
9f60: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
9f70: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
9f80: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
9f90: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
9fa0: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
9fb0: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
9fc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
9fd0: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
9fe0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
9ff0: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
a000: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
a010: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
a020: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
a030: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
a040: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
a050: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
a060: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
a070: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
a080: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
a090: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
a0a0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
a0b0: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
a0c0: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
a0d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a0e0: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
a0f0: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
a100: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
a110: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
a120: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
a130: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
a140: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
a150: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
a160: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
a170: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
a180: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
a190: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
a1a0: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
a1c0: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
a1d0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
a1e0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
a1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a200: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
a210: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
a220: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
a230: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
a240: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
a250: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
a260: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
a270: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
a280: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
a290: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
a2a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
a2b0: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
a2c0: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
a2d0: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
a2e0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
a2f0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
a300: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
a310: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
a320: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
a330: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
a340: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
a350: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
a360: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
a370: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
a380: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
a390: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
a3a0: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
a3b0: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
a3c0: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
a3d0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
a3e0: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
a3f0: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
a400: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
a410: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
a420: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
a430: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
a440: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
a450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a460: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
a470: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a480: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
a490: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
a4a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a4b0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a4c0: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
a4d0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
a4e0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
a4f0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
a500: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
a510: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
a520: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
a530: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
a540: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
a550: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
a560: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
a570: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a580: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
a590: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
a5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a5b0: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
a5c0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
a5d0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
a5e0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a5f0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
a600: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
a610: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
a620: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
a630: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
a640: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
a650: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
a660: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
a670: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
a680: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
a690: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
a6a0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
a6b0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
a6c0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
a6d0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
a6e0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
a6f0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
a700: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
a710: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
a720: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
a730: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
a740: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
a750: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
a760: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a770: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
a780: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
a790: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
a7a0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
a7b0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
a7c0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
a7d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
a7e0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
a7f0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
a800: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
a810: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
a820: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
a830: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
a840: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
a850: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f  e called exact o
a860: 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69  nce on a each vi
a870: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
a880: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
a890: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a8a0: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
a8b0: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
a8c0: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
a8d0: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
a8e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
a8f0: 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f   futher calls to
a900: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
a910: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
a920: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
a930: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a940: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
a950: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
a960: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
a970: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
a980: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
a990: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
a9a0: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
a9b0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
a9c0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
a9d0: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
a9e0: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
a9f0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
aa00: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
aa10: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
aa20: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
aa30: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
aa40: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
aa50: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
aa60: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
aa70: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
aa80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
aab0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aae0: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
aaf0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ab10: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
ab20: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
ab30: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
ab40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ab50: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
ab60: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
ab70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ab90: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
aba0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
abb0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
abd0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
abe0: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
abf0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac10: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
ac20: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
ac30: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e  ams */.  int nOn
ac40: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
ac50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac60: 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  r of OP_Once ins
ac70: 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  tructions */.  i
ac80: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aca0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
acb0: 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20  .  u8 *zCsr;    
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69    /* Memory avai
ace0: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
acf0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45  tion */.  u8 *zE
ad00: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
ad10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
ad20: 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f  t byte past allo
ad30: 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  cated memory */.
ad40: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74   /* How much ext
ad70: 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65  ra memory is nee
ad80: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
ad90: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
ada0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
adb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
adc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
add0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
ade0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
adf0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
ae00: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
ae10: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
ae20: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
ae30: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
ae40: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
ae50: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
ae60: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
ae70: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
ae80: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
ae90: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
aea0: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
aeb0: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
aec0: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
aed0: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
aee0: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
aef0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
af00: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
af10: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
af20: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
af30: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
af40: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
af50: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
af60: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
af70: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
af80: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
af90: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
afa0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
afb0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
afc0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
afd0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
afe0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
aff0: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
b000: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
b010: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
b020: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
b030: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
b040: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
b050: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
b060: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
b070: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
b080: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
b090: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
b0a0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
b0b0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
b0c0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b0d0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
b0e0: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
b0f0: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
b100: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
b110: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
b120: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
b130: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
b140: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
b150: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
b160: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b170: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b180: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
b190: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b1a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
b1b0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
b1c0: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
b1d0: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
b1e0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
b1f0: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
b200: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
b210: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
b220: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
b230: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
b240: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
b250: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
b260: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
b270: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
b280: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
b290: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
b2a0: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
b2b0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b2c0: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
b2d0: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
b2e0: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
b2f0: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
b300: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
b310: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
b320: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a  ated in two.  **
b330: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
b340: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
b350: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
b360: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
b370: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
b380: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
b390: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
b3a0: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
b3b0: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
b3c0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
b3d0: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
b3e0: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
b3f0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
b400: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
b410: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
b420: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
b430: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
b440: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
b450: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
b460: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
b470: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
b480: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
b490: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
b4a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
b4b0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
b4c0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
b4d0: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
b4e0: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
b4f0: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
b500: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
b510: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79  /.  do {.    nBy
b520: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  te = 0;.    p->a
b530: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
b540: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
b550: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b560: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b570: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
b580: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
b590: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b5a0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b5b0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b5c0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
b5d0: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
b5e0: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
b5f0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b600: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b610: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
b620: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
b630: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
b640: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b650: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
b660: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
b670: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
b680: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
b690: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
b6c0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b6d0: 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63  OnceFlag = alloc
b6e0: 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c  Space(p->aOnceFl
b6f0: 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72  ag, nOnce, &zCsr
b700: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b710: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
b720: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65  {.      p->pFree
b730: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b740: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
b750: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73  );.    }.    zCs
b760: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
b770: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
b780: 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28  Byte];.  }while(
b790: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
b7a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
b7b0: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28    p->nCursor = (
b7c0: 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 70  u16)nCursor;.  p
b7d0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
b7e0: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
b7f0: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
b800: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
b810: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
b820: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
b830: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
b840: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
b850: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
b860: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
b870: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61   }.  if( p->azVa
b880: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61  r ){.    p->nzVa
b890: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61  r = pParse->nzVa
b8a0: 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  r;.    memcpy(p-
b8b0: 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  >azVar, pParse->
b8c0: 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a  azVar, p->nzVar*
b8d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b  sizeof(p->azVar[
b8e0: 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  0]));.    memset
b8f0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20  (pParse->azVar, 
b900: 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  0, pParse->nzVar
b910: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
b920: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a  azVar[0]));.  }.
b930: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b940: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20  .    p->aMem--; 
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
b970: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
b980: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   */.    p->nMem 
b990: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
b9a0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
b9b0: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
b9c0: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  m-1 */.    for(n
b9d0: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
b9e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
b9f0: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
ba00: 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70  Invalid;.      p
ba10: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
ba20: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  b;.    }.  }.  p
ba30: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72  ->explain = pPar
ba40: 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73  se->explain;.  s
ba50: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
ba60: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
ba70: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
ba80: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
ba90: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
baa0: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
bab0: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
bac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bad0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
bae0: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
baf0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
bb00: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
bb10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
bb20: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
bb30: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
bb40: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
bb60: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
bb70: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
bb80: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
bb90: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
bba0: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
bbb0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
bbc0: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
bbd0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
bbe0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
bbf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
bc00: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
bc10: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
bc20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bc30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
bc40: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
bc50: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
bc60: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
bc70: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
bc80: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
bc90: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
bca0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
bcb0: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
bcc0: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
bcd0: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
bce0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
bcf0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
bd00: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
bd10: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
bd20: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  if.}../*.** Copy
bd30: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
bd40: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
bd50: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
bd60: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
bd70: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
bd80: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
bd90: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
bda0: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
bdb0: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
bdc0: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
bdd0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
bde0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bdf0: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
be00: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
be10: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
be20: 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  v;.  v->aOnceFla
be30: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
be40: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
be50: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
be60: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
be70: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
be80: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
be90: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
bea0: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
beb0: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
bec0: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
bed0: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
bee0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
bef0: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
bf00: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
bf10: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
bf20: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
bf30: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
bf40: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
bf50: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
bf60: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
bf70: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
bf80: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
bf90: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
bfa0: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
bfb0: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
bfc0: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
bfd0: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
bfe0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
bff0: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
c000: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
c010: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
c020: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
c030: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
c040: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
c050: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
c060: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
c070: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c080: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
c090: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
c0a0: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
c0b0: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
c0c0: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
c0d0: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
c0e0: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
c0f0: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
c100: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
c110: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
c120: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
c130: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
c140: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
c150: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
c160: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
c170: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c180: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c190: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
c1a0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
c1b0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
c1c0: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
c1d0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
c1e0: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
c1f0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
c200: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
c210: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
c220: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
c230: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
c240: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
c250: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
c260: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
c270: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
c280: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
c290: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
c2a0: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
c2b0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
c2c0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
c2d0: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
c2e0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
c2f0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
c300: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
c310: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
c320: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
c330: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
c340: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
c350: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
c360: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
c370: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
c380: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
c390: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
c3a0: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
c3b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
c3c0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
c3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c3e0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
c3f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
c400: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
c410: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
c420: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
c430: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
c440: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
c450: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
c460: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
c470: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
c480: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
c490: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
c4a0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c4b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
c4c0: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
c4d0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c4e0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
c4f0: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
c500: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
c510: 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20  gs==MEM_Invalid 
c520: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c530: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c540: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
c550: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c560: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
c570: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
c580: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
c590: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c5a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
c5b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
c5c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
c5d0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
c5e0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
c5f0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
c600: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
c610: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
c620: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
c630: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
c640: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
c650: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
c660: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
c670: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c690: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
c6a0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
c6b0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
c6c0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
c6d0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
c6e0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
c6f0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
c700: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
c710: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
c720: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
c730: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
c740: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
c750: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c760: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
c770: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
c780: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
c790: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
c7a0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
c7b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c7c0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
c7d0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
c7e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c7f0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
c800: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
c810: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c820: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
c830: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
c840: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
c850: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c860: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
c870: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
c880: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
c890: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
c8a0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
c8b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c8c0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
c8d0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
c8e0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
c8f0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
c900: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
c910: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
c920: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
c930: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
c940: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
c950: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
c960: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
c970: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
c980: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
c990: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
c9a0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c9b0: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
c9c0: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
c9d0: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
c9e0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
c9f0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
ca00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ca10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
ca20: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
ca50: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
ca60: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
ca90: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
caa0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
cab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
cad0: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
cae0: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
caf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cb00: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
cb10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
cb20: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
cb30: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
cb40: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
cb70: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
cb80: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
cb90: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
cba0: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
cbb0: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
cbc0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
cbd0: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
cbe0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
cbf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
cc00: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
cc10: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
cc20: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
cc30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cc40: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
cc50: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
cc60: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
cc70: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
cc80: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
cc90: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
cca0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
ccb0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
ccc0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
ccd0: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
cce0: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
ccf0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
cd00: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
cd10: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
cd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd30: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
cd40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
cd50: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
cd60: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
cd70: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
cd80: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
cd90: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
cda0: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
cdb0: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
cdc0: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
cdd0: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
cde0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cdf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ce00: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
ce10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ce20: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
ce30: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
ce40: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
ce50: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
ce60: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
ce70: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
ce80: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
ce90: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
cea0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
ceb0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cec0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
ced0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
cee0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
cef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
cf00: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
cf10: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
cf20: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
cf30: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
cf40: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
cf50: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
cf60: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
cf70: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
cf80: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
cf90: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
cfa0: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
cfb0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
cfc0: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
cfd0: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
cfe0: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
cff0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
d000: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
d010: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
d020: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
d030: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
d040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
d050: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
d060: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
d070: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
d080: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
d090: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
d0a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d0b0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d0c0: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d  VtabSync(db, &p-
d0d0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a  >zErrMsg);..  /*
d0e0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
d0f0: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
d100: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
d110: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
d120: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
d130: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
d140: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
d150: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
d160: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
d170: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
d180: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
d190: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
d1a0: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
d1b0: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
d1c0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
d1d0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
d1e0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
d1f0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
d200: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
d210: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
d220: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
d230: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
d240: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
d250: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
d260: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d270: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
d280: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
d290: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
d2a0: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
d2b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
d2c0: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
d2d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d2e0: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
d2f0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
d300: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
d310: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d320: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d330: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
d350: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
d360: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
d370: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
d380: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
d390: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
d3a0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
d3b0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
d3c0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
d3d0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
d3e0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
d3f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d400: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
d410: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  AINT;.    }.  }.
d420: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
d430: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
d440: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
d450: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
d460: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
d470: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
d480: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
d490: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
d4a0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
d4b0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
d4c0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
d4d0: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
d4e0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
d4f0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
d500: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
d510: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
d520: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
d530: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
d540: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
d550: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
d560: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
d570: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
d580: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
d590: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
d5a0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
d5b0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
d5c0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
d5d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
d5e0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
d5f0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
d600: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
d610: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
d620: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d630: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d640: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d650: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d660: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d670: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
d680: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d690: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d6a0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
d6b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d6c0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
d6d0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
d6e0: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
d6f0: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
d700: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
d710: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
d720: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
d730: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
d740: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
d750: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
d760: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
d770: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
d780: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
d790: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
d7a0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
d7b0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
d7c0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
d7d0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d7e0: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
d7f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d800: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d810: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d820: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d830: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d840: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d850: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
d860: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d870: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
d880: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
d890: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d8a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
d8c0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
d8d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d8e0: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
d8f0: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
d900: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
d910: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
d920: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
d930: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
d940: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
d950: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
d960: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
d970: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
d980: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
d990: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
d9a0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
d9b0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
d9c0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
d9d0: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
d9e0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
d9f0: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
da00: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
da10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
da20: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
da30: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
da40: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
da50: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
da60: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
da70: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
da80: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
da90: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
daa0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
dab0: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
dac0: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
dad0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
dae0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
daf0: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
db00: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
db10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
db20: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
db30: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
db40: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
db50: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
db60: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
db70: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
db80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
db90: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
dba0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
dbb0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
dbc0: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
dbd0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
dbe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
dbf0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
dc00: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
dc10: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
dc20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
dc30: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
dc40: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
dc50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
dc60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dc70: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
dc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dc90: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
dca0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
dcb0: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
dcc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dcd0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
dce0: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
dcf0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
dd00: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
dd10: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
dd20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
dd30: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
dd40: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
dd50: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
dd80: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
dd90: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
dda0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ddb0: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ddc0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ddd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dde0: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ddf0: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
de00: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
de10: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
de20: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
de30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
de40: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
de50: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
de60: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
de70: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
de80: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
de90: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
dea0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
deb0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
dec0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
ded0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
dee0: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
def0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
df00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
df10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
df20: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
df30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
df40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
df50: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
df60: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
df70: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
df80: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
df90: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
dfa0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
dfb0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
dfc0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
dfd0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
dfe0: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
dff0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
e000: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e010: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e020: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e030: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e040: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
e050: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
e060: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
e070: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
e080: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
e090: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
e0a0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e0b0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
e0c0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
e0d0: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
e0e0: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
e0f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e100: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
e110: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
e120: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
e130: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
e140: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
e150: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
e160: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
e170: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
e180: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
e190: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
e1a0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
e1b0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
e1c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
e1d0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e1e0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e1f0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e200: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e210: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e220: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
e230: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
e240: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
e250: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
e260: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
e270: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
e280: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
e290: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
e2a0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
e2b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e2c0: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
e2d0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
e2e0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
e2f0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
e300: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
e310: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
e320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e330: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e340: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
e350: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
e360: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
e370: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
e380: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
e390: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e3a0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
e3b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e3d0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e3e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
e3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
e400: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e410: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
e420: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e430: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e440: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
e450: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
e460: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e470: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
e480: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e490: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
e4a0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
e4b0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
e4c0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
e4d0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
e4e0: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
e4f0: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
e500: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e510: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
e520: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
e530: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
e540: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
e550: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
e560: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
e570: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
e580: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
e590: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
e5a0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e5c0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e5d0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
e5e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e5f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e610: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
e620: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
e630: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
e640: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
e650: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
e660: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
e670: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
e680: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
e690: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
e6a0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
e6b0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
e6c0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
e6d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e6e0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
e6f0: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
e700: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
e710: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
e720: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
e730: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e740: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
e750: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
e760: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
e770: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
e780: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
e790: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
e7a0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
e7b0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
e7c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
e7d0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
e7e0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e7f0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
e800: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
e810: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
e820: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e840: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e850: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
e860: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e870: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e880: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e890: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e8a0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e8b0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
e8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e8d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e8e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e8f0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e900: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
e910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e920: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e930: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e940: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e950: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
e960: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
e970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e980: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
e990: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
e9a0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
e9b0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
e9c0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
e9d0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
e9e0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
e9f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ea00: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
ea10: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ea20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
ea30: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
ea40: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
ea50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
ea60: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
ea70: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
ea80: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
ea90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
eaa0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
eab0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
eac0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ead0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
eae0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
eaf0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
eb00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
eb10: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
eb20: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
eb30: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
eb40: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
eb50: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
eb60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
eb70: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
eb80: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
eb90: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
eba0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
ebb0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
ebc0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
ebd0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
ebe0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
ebf0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
ec00: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
ec10: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
ec20: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
ec30: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
ec40: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
ec50: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
ec60: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
ec70: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
ec80: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
ec90: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
eca0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ecb0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
ecc0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
ecd0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
ece0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
ecf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ed00: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
ed10: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
ed20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ed30: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
ed40: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
ed50: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ed60: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
ed70: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
ed80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
ed90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
eda0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
edb0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
edc0: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
edd0: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
ede0: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
edf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
ee00: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
ee10: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
ee20: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
ee30: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
ee40: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
ee50: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
ee60: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
ee70: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
ee80: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
ee90: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
eea0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
eeb0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
eec0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
eed0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
eee0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
eef0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
ef00: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
ef10: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
ef20: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
ef30: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
ef40: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
ef50: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20  nWrite = 0;.  p 
ef60: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
ef70: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
ef80: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
ef90: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
efa0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
efb0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
efc0: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
efd0: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
efe0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
eff0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
f000: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
f010: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61  veVdbeCnt );.  a
f020: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
f030: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
f040: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
f050: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
f060: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
f070: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
f080: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
f090: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
f0a0: 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
f0b0: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
f0c0: 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
f0d0: 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
f0e0: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
f0f0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f100: 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
f110: 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
f120: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
f130: 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
f140: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
f150: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
f160: 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
f170: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
f180: 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
f190: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
f1a0: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74  saction is commt
f1b0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
f1c0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f1d0: 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
f1e0: 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
f1f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
f200: 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
f210: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
f220: 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
f230: 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
f240: 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
f250: 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
f260: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
f270: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
f280: 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
f290: 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
f2a0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f2b0: 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
f2c0: 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
f2d0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
f2e0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
f2f0: 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
f300: 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
f310: 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
f320: 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
f330: 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67  occured, causing
f340: 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
f350: 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
f360: 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
f370: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
f380: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
f390: 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
f3a0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
f3b0: 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
f3c0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
f3d0: 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
f3e0: 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
f3f0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
f400: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
f410: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f420: 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
f430: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
f440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
f450: 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
f460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f470: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
f480: 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
f490: 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
f4a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f4b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
f4c0: 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
f4d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f4e0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f4f0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f500: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f510: 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
f520: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f530: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
f540: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
f550: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
f560: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f570: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f580: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f590: 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
f5a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f5b0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
f5c0: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
f5d0: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
f5e0: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
f5f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f600: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f610: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f620: 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
f630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f640: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
f650: 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
f660: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f670: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
f680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f690: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f6a0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f6b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f6c0: 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
f6d0: 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
f6e0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
f6f0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f700: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
f710: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f720: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f730: 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
f740: 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
f750: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f760: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f770: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f780: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f790: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
f7a0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
f7b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
f7c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
f7d0: 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
f7e0: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
f7f0: 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
f800: 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
f810: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
f820: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f830: 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
f840: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f850: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f860: 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
f870: 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
f880: 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d  mtDefCons;.    }
f890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f8a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f8b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f8c0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
f8d0: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
f8e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
f8f0: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
f900: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
f910: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
f920: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
f930: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
f940: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
f950: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
f960: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
f970: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
f980: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
f990: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
f9a0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
f9b0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
f9c0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
f9d0: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
f9e0: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
f9f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
fa00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
fa10: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
fa20: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
fa30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
fa40: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
fa50: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
fa60: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
fa70: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
fa80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fa90: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
faa0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
fab0: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
fac0: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
fad0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
fae0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
faf0: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
fb00: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
fb10: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
fb20: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
fb30: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
fb40: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
fb50: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
fb60: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
fb70: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
fb80: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
fb90: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
fba0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
fbb0: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
fbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fbd0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
fbe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
fbf0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fc00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fc10: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
fc20: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
fc30: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
fc40: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
fc50: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
fc60: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
fc70: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
fc80: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
fc90: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
fca0: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
fcb0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
fcc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fcd0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
fce0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
fcf0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
fd00: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
fd10: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
fd20: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
fd30: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
fd40: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
fd50: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
fd60: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
fd70: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
fd80: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fd90: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
fda0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
fdb0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
fdc0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
fdd0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
fde0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
fdf0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
fe00: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
fe10: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
fe20: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
fe30: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
fe40: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
fe50: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
fe60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
fe90: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
fea0: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
feb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
fec0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
fed0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
fee0: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
fef0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
ff00: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
ff10: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
ff20: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
ff30: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
ff40: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
ff50: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
ff60: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
ff70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
ff80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
ff90: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
ffa0: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
ffb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
ffc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
ffd0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
ffe0: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
fff0: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
10000 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10010 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
10020 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
10030 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
10040 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
10050 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
10060 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
10070 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
10080 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10090 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
100a0 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
100b0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
100c0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
100d0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
100e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
100f0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
10100 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10110 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
10120 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10130 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
10140 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
10150 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
10160 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
10170 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
10180 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
10190 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
101a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
101b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
101c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
101d0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
101e0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
101f0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
10200 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
10210 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28  started */.  if(
10220 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
10230 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
10240 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
10250 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
10260 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
10270 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
10280 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
10290 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
102a0 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
102b0 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
102c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
102d0 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
102e0 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
102f0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
10300 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
10310 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
10320 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
10330 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
10340 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
10350 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xff;.    assert(
10360 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49   p->rc!=SQLITE_I
10370 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20  OERR_BLOCKED ); 
10380 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e   /* This error n
10390 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20  o longer exists 
103a0 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  */.    isSpecial
103b0 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
103c0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
103d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
10400 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
10410 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
10420 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
10430 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
10440 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
10450 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
10460 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
10470 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
10480 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
10490 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
104a0 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
104b0 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
104c0 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
104d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
104e0 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
104f0 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
10500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10510 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
10520 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
10530 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10540 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
10550 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
10560 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
10570 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
10580 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
10590 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
105a0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
105b0 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
105c0 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
105d0 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69  ccured while wri
105e0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
105f0 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
10600 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
10610 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
10620 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
10630 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
10640 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
10650 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
10660 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
10670 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
10680 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
10690 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
106a0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
106b0 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
106c0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
106d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
106e0 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
106f0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10700 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10710 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
10720 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
10730 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
10740 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
10750 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
10760 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10770 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
10780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10790 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
107a0 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
107b0 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
107c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
107d0 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
107e0 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
107f0 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
10800 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
10810 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
10820 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
10830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
10840 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10850 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
10860 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
10870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
10880 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
10890 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
108a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
108b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
108c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
108d0 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65  * Check for imme
108e0 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
108f0 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f  y violations. */
10900 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
10910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10930 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20  eckFk(p, 0);.   
10940 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
10950 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
10960 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
10970 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
10980 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
10990 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
109a0 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
109b0 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
109c0 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
109d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
109e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
109f0 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
10a00 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
10a10 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
10a20 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
10a30 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
10a40 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
10a50 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
10a60 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
10a70 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
10a80 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
10a90 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
10aa0 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  t==(p->readOnly=
10ab0 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
10ac0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10ad0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
10ae0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10af0 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
10b00 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
10b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10b20 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
10b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
10b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10b50 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
10b60 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
10b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10b80 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
10b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
10ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10bb0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
10bc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10bd0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10be0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10bf0 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
10c00 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10c10 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
10c20 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
10c30 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
10c40 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
10c50 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
10c60 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
10c70 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
10c80 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
10c90 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
10ca0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
10cb0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
10cc0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
10cd0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
10ce0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
10cf0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
10d00 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
10d10 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
10d20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
10d30 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10d40 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
10d50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d60 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
10d70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10d80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
10d90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10db0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
10dc0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
10dd0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10de0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
10df0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  K);.        }els
10e00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
10e10 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10e20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
10e30 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
10e40 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
10e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10e70 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10e80 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
10e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ea0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
10eb0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
10ec0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
10ed0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
10ee0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10ef0 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
10f00 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
10f10 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
10f20 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
10f30 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
10f40 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
10f50 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
10f60 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
10f70 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
10f80 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
10f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10fa0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
10fb0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
10fc0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
10fd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10fe0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
10ff0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
11000 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
11010 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
11020 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
11030 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
11040 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
11050 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11060 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
11070 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
11080 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
11090 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
110a0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
110b0 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
110c0 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
110d0 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
110e0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
110f0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
11100 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
11110 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
11120 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
11130 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
11140 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
11150 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
11160 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
11170 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
11180 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
11190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
111a0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
111b0 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
111c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
111d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
111e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
111f0 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
11200 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
11210 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
11220 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
11230 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11240 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
11250 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
11260 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
11270 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
11280 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
11290 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
112a0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
112b0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
112c0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
112d0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
112e0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
112f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11300 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
11310 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
11320 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
11330 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11340 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
11350 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
11360 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
11370 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11380 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
11390 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
113a0 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
113b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
113c0 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
113d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
113e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
113f0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
11400 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
11410 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11430 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
11440 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11450 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
11460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11470 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
11480 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
11490 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
114a0 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
114b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
114c0 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
114d0 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
114e0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
114f0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
11500 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62     db->activeVdb
11510 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  eCnt--;.    if( 
11520 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  !p->readOnly ){.
11530 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
11540 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  dbeCnt--;.    }.
11550 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11560 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64  activeVdbeCnt>=d
11570 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
11580 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
11590 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
115a0 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
115b0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
115c0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
115d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
115e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
115f0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
11600 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
11610 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
11620 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
11630 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
11640 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
11650 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
11660 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
11670 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
11680 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
11690 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
116a0 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
116b0 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
116c0 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
116d0 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
116e0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
116f0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
11700 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
11710 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
11720 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c  tiveVdbeCnt>0 ||
11730 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
11740 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
11750 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
11760 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
11770 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
11780 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
11790 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
117a0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
117b0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
117c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
117d0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
117e0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
117f0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
11800 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
11810 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
11820 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11830 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
11840 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
11850 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
11860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
11870 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
11880 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
11890 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
118a0 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
118b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
118c0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
118d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
118e0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
118f0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
11900 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
11910 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
11920 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
11930 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
11940 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
11950 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
11960 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
11970 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
11980 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
11990 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
119a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
119b0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
119c0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
119d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
119e0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
119f0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
11a00 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
11a10 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  8 mallocFailed =
11a20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11a30 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  d;.    sqlite3Be
11a40 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
11a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
11a60 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
11a70 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
11a80 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
11a90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
11aa0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
11ab0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
11ac0 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
11ad0 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46  Failed = mallocF
11ae0 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65  ailed;.    db->e
11af0 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
11b00 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11b10 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
11b20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  rc;.}../*.** Cle
11b40 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
11b50 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
11b60 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
11b70 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
11b80 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
11b90 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
11ba0 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
11bb0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
11bc0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
11bd0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
11be0 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
11bf0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
11c00 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
11c10 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
11c20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
11c30 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
11c40 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
11c50 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
11c60 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
11c70 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
11c80 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
11c90 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
11ca0 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
11cb0 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
11cc0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
11cd0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
11ce0 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
11cf0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
11d00 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
11d10 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
11d20 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
11d30 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
11d40 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
11d50 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
11d60 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
11d70 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
11d80 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
11d90 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
11da0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
11db0 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
11dc0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
11dd0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
11de0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
11df0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
11e00 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
11e10 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
11e20 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
11e30 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
11e40 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
11e50 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
11e60 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
11e70 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
11e80 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
11e90 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
11ea0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11eb0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
11ec0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
11ed0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
11ee0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11ef0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
11f00 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
11f10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11f20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
11f30 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
11f40 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
11f50 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
11f60 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
11f70 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
11f80 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
11f90 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
11fa0 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
11fb0 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
11fc0 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
11fd0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
11fe0 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
11ff0 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
12000 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
12010 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
12020 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
12030 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
12040 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
12050 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
12060 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
12070 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12080 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
12090 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
120a0 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
120b0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
120c0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
120d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
120e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
120f0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
12100 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
12110 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
12120 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
12130 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
12140 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
12150 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
12160 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
12170 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
12180 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
12190 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
121a0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
121b0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
121c0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
121d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
121e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
121f0 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
12200 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
12210 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
12220 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
12230 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
12240 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
12250 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
12260 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
12270 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
12280 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12290 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
122a0 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
122b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
122c0 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
122d0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
122e0 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
122f0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
12300 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
12310 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
12320 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
12330 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
12340 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
12350 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
12360 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
12370 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
12380 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
12390 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
123a0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
123b0 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
123c0 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
123d0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
123e0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
123f0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
12400 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
12410 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
12420 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
12430 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
12440 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
12450 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
12460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12470 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
12480 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
12490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
124a0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
124b0 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
124c0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
124d0 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
124e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
124f0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
12500 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
12510 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
12520 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
12530 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
12540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12550 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
12560 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
12570 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
12580 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
12590 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
125a0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
125b0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
125c0 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
125d0 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
125e0 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
125f0 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
12600 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
12610 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
12620 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
12630 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
12640 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12650 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
12660 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
12670 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
12680 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12690 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
126a0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
126b0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
126c0 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
126d0 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
126e0 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
126f0 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26  ((u32)1)<<i))) &
12700 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
12710 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
12720 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
12730 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
12740 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
12750 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
12760 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
12770 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
12780 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
12790 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
127a0 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
127b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
127c0 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69  ument..** The di
127d0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
127e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
127f0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
12800 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
12810 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
12820 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
12830 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
12840 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
12850 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
12860 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12870 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
12880 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f  lite3VdbeDeleteO
12890 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
128a0 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
128b0 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
128c0 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69   *pNext;.  int i
128d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
128e0 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64  b==0 || p->db==d
128f0 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  b );.  releaseMe
12900 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
12910 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65  p->nVar);.  rele
12920 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
12930 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
12940 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
12950 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
12960 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
12970 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
12980 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
12990 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
129a0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
129b0 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
129c0 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
129d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
129e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  );.  }.  for(i=p
129f0 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b  ->nzVar-1; i>=0;
12a00 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46   i--) sqlite3DbF
12a10 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72  ree(db, p->azVar
12a20 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65  [i]);.  vdbeFree
12a30 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
12a40 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
12a50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12a60 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73   p->aLabel);.  s
12a70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12a80 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
12a90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12aa0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73  b, p->zSql);.  s
12ab0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12ac0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20   p->pFree);.#if 
12ad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
12ae0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
12af0 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46  IN).  sqlite3DbF
12b00 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c  ree(db, p->zExpl
12b10 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ain);.  sqlite3D
12b20 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78  bFree(db, p->pEx
12b30 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 20  plain);.#endif. 
12b40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12b50 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
12b60 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
12b70 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
12b80 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12b90 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
12ba0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
12bb0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
12bc0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
12bd0 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  >db;.  if( p->pP
12be0 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12bf0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12c00 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12c10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12c20 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
12c30 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
12c40 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
12c50 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
12c60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
12c70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
12c80 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
12c90 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
12ca0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
12cb0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
12cc0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ject(db, p);.}..
12cd0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12ce0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
12cf0 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
12d00 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
12d10 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
12d20 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
12d30 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
12d40 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
12d50 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
12d60 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
12d70 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
12d80 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
12d90 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
12da0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
12db0 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
12dc0 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
12dd0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
12de0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
12df0 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
12e00 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
12e10 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
12e20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
12e30 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
12e40 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
12e50 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
12e60 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
12e70 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
12e80 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
12e90 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
12ea0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
12eb0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
12ec0 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
12ed0 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
12ee0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
12ef0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12f00 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
12f10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12f20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
12f30 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
12f40 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
12f50 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
12f60 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
12f70 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
12f80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12f90 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
12fa0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
12fb0 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
12fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12fd0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
12fe0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12ff0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
13000 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
13010 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
13020 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
13030 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13040 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
13050 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
13060 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
13070 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
13080 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13090 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
130a0 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
130b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
130c0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
130d0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
130e0 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
130f0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
13100 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
13110 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
13120 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
13130 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
13140 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64      int hasMoved
13150 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
13160 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
13170 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
13180 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29  rsor, &hasMoved)
13190 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
131a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
131b0 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20  ( hasMoved ){.  
131c0 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
131d0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
131e0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52  ;.      p->nullR
131f0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ow = 1;.    }.  
13200 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13210 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
13220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
13230 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
13240 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13250 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
13260 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
13270 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
13280 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
13290 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
132a0 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
132b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
132c0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
132d0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
132e0 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
132f0 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
13300 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
13310 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
13320 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
13330 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
13340 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
13350 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
13360 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
13370 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
13380 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
13390 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
133a0 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
133b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
133c0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
133d0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
133e0 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
133f0 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
13400 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
13410 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
13420 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
13430 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
13440 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
13450 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
13460 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
13470 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
13480 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
13490 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
134a0 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
134b0 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
134c0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
134d0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
134e0 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
134f0 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
13500 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13510 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
13520 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
13530 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
13540 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
13550 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
13560 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
13570 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
13580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
13590 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
135a0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
135b0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
135e0 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
13610 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13620 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
13630 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
13640 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13650 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13660 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
13670 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
13680 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13690 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
136c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
136d0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
136e0 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
136f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13700 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13730 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13740 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
13760 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
13770 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
137a0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
137b0 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
137e0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
137f0 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
13820 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
13830 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
13840 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
13850 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
13860 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
13870 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
13880 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
13890 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
138a0 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
138b0 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
138c0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
138d0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
138e0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
138f0 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
13900 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
13910 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
13920 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
13930 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
13940 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
13950 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
13960 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13970 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
13980 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
13990 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
139a0 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
139b0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
139c0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
139d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
139e0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
139f0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
13a00 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
13a10 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
13a20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
13a30 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
13a40 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
13a50 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
13a60 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
13a70 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
13a80 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
13a90 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
13aa0 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
13ab0 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20  turn 8+(u32)i;. 
13ac0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30     }.    if( i<0
13ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
13ae0 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72  (-MAX_6BYTE) ) r
13af0 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f  eturn 6;.      /
13b00 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20  * Previous test 
13b10 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d  prevents:  u = -
13b20 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
13b30 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20  75808) */.      
13b40 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73  u = -i;.    }els
13b50 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
13b60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
13b70 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
13b80 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
13b90 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
13ba0 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
13bb0 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
13bc0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
13bd0 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
13be0 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
13bf0 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
13c00 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
13c10 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
13c20 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
13c30 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
13c40 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
13c50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
13c60 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
13c70 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
13c80 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
13c90 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
13ca0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
13cb0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
13cc0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
13cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
13ce0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
13cf0 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
13d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13d10 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
13d20 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
13d30 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
13d40 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
13d50 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
13d60 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
13d70 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
13d80 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
13d90 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
13da0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
13db0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
13dc0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
13dd0 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
13de0 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
13df0 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
13e00 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
13e10 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
13e20 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
13e30 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
13e40 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
13e50 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
13e60 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
13e70 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
13e80 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
13e90 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
13ea0 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
13eb0 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
13ec0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
13ed0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
13ee0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
13ef0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
13f00 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
13f10 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
13f20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
13f30 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
13f40 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
13f50 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
13f60 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
13f70 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
13f80 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
13f90 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
13fa0 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
13fb0 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
13fc0 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
13fd0 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
13fe0 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
13ff0 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
14000 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
14010 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
14020 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
14030 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
14040 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
14050 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
14060 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
14070 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
14080 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
14090 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
140a0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
140b0 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
140c0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
140d0 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
140e0 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
140f0 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
14100 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
14110 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
14120 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
14130 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
14140 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
14150 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
14160 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
14170 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
14180 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
14190 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
141a0 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
141b0 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
141c0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
141d0 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
141e0 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
141f0 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
14200 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
14210 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
14220 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
14230 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
14240 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
14250 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
14260 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
14270 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
14280 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
14290 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
142a0 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
142b0 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
142c0 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
142d0 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
142e0 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
142f0 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
14300 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
14310 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
14320 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
14330 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
14340 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
14350 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
14360 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
14370 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
14380 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
14390 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
143a0 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
143b0 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
143c0 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
143d0 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
143e0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
143f0 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
14400 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
14410 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
14420 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
14430 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
14440 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
14450 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
14460 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
14470 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
14480 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
14490 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
144a0 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
144b0 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
144c0 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
144d0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
144e0 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
144f0 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
14500 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
14510 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
14520 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
14530 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
14540 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
14550 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
14560 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
14570 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
14580 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
14590 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
145a0 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
145b0 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
145c0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
145d0 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
145e0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
145f0 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
14600 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
14610 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
14620 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
14630 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
14640 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
14650 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
14660 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
14670 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
14680 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
14690 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
146a0 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
146b0 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
146c0 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
146d0 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
146e0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
146f0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
14700 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
14710 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
14720 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
14730 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
14740 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
14750 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
14760 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
14770 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
14780 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
14790 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
147a0 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
147b0 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
147c0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
147d0 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
147e0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
147f0 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
14800 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
14810 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
14820 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14830 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
14840 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
14850 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
14860 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
14870 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
14880 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
14890 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
148a0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
148b0 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
148c0 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
148d0 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
148e0 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
148f0 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
14900 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
14910 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
14920 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
14930 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
14940 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
14950 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
14960 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
14970 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
14980 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
14990 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
149a0 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
149b0 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
149c0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
149d0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
149e0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
149f0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
14a00 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
14a10 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
14a20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
14a30 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
14a40 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
14a50 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14a60 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
14a70 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
14a80 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
14a90 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
14aa0 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
14ab0 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
14ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ad0 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
14ae0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
14af0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
14b00 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
14b10 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
14b20 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29  sert( len<=(u32)
14b30 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
14b40 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
14b50 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26  buf[i] = (u8)(v&
14b60 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
14b70 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
14b80 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
14b90 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
14ba0 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
14bb0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
14bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
14bd0 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
14be0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
14bf0 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
14c00 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
14c10 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
14c20 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14c30 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
14c40 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
14c50 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
14c60 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
14c70 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
14c80 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
14c90 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
14ca0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
14cb0 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
14cc0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
14cd0 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
14ce0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14cf0 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20  len > (u32)nBuf 
14d00 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
14d10 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20   (u32)nBuf;.    
14d20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
14d30 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
14d40 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
14d50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14d60 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14d70 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
14d80 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
14d90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14da0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
14db0 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
14dc0 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
14dd0 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
14de0 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
14df0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14e00 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
14e10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14e20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
14e30 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14e40 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
14e50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14e60 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
14e70 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
14e80 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
14e90 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
14ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
14eb0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
14ec0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
14ed0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
14ef0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
14f00 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
14f10 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
14f20 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
14f30 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
14f40 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
14f50 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
14f60 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
14f70 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
14f80 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
14f90 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
14fa0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
14fb0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
14fc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14fd0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
14fe0 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
14ff0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
15000 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
15010 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15020 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
15030 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
15050 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15060 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
15070 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15080 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
15090 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
150a0 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
150b0 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
150c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
150d0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
150e0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
150f0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
15100 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15110 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
15120 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
15130 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
15140 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
15150 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
15160 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15170 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
15180 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
15190 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
151a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
151b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
151c0 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
151d0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
151e0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
151f0 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
15200 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15210 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15220 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
15230 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
15240 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
15250 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15260 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
15270 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
15280 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
15290 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
152a0 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
152b0 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
152c0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
152d0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
152e0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
152f0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
15300 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
15310 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
15330 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15340 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
15350 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15360 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
15370 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
15380 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
15390 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
153a0 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
153b0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
153c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
153d0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
153e0 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
153f0 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
15400 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
15410 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
15420 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
15430 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
15440 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
15450 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
15460 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
15470 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
15480 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
15490 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
154a0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
154b0 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
154c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
154d0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
154e0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
154f0 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
15500 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
15510 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
15520 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
15530 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
15540 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
15550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15560 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
15570 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
15580 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
15590 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
155a0 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
155b0 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
155c0 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
155d0 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
155e0 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
155f0 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
15600 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
15610 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
15620 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
15630 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
15640 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
15650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
15660 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
15670 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
15680 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
156a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
156b0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
156c0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
156d0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
156e0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
156f0 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
15700 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
15710 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
15720 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15730 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
15740 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
15750 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
15760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15770 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
15780 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
15790 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
157a0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
157b0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
157c0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
157d0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
157e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
157f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15800 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15810 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
15820 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
15830 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
15840 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
15850 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
15860 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
15870 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
15880 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
15890 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
158a0 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
158b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
158c0 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
158d0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
158e0 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
158f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
15900 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
15910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
15920 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
15930 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15940 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15950 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
15960 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
15970 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
15980 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
15990 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
159a0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
159b0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
159c0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
159d0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
159e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
159f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
15a00 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
15a10 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
15a20 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
15a30 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
15a40 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
15a50 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
15a60 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
15a70 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
15a80 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
15a90 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
15aa0 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
15ab0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
15ac0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
15ad0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
15ae0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
15af0 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
15b00 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
15b10 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
15b20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
15b30 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
15b40 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
15b50 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
15b60 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
15b70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
15b80 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
15b90 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
15ba0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
15bb0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
15bc0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
15bd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
15be0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
15bf0 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
15c00 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
15c10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15c30 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
15c40 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
15c50 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
15c80 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
15c90 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
15cc0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
15cd0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
15ce0 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
15cf0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
15d00 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
15d10 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
15d20 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
15d30 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
15d40 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
15d50 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
15d60 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
15d90 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
15da0 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
15db0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15de0 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
15df0 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
15e00 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
15e10 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
15e20 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
15e30 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
15e40 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
15e50 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
15e60 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
15e70 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
15e80 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
15e90 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
15ea0 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
15eb0 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
15ec0 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
15ed0 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
15ee0 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
15ef0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
15f00 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
15f10 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
15f20 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
15f30 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
15f40 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
15f50 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
15f60 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
15f70 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
15f80 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
15f90 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
15fa0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
15fb0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
15fc0 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
15fd0 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
15fe0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
15ff0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
16000 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
16010 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
16020 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
16030 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
16040 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
16050 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
16060 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
16070 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  ];.  p->pKeyInfo
16080 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
16090 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
160a0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
160b0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
160c0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
160d0 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
160e0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
160f0 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
16100 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
16110 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
16120 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
16130 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
16140 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
16150 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16160 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
16170 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
16180 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
16190 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
161a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
161b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
161c0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
161d0 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
161e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
161f0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
16200 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
16210 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
16220 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
16230 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
16240 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16250 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
16260 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
16270 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
16280 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
16290 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
162a0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
162b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
162c0 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
162d0 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
16300 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
16310 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
16340 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
16350 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
16360 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
16370 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66  p->aMem;..  p->f
16380 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  lags = 0;.  asse
16390 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
163a0 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
163b0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
163c0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
163d0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
163e0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
163f0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
16400 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
16410 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
16420 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
16430 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
16440 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
16450 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
16460 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
16470 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
16480 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
16490 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
164a0 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
164b0 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
164c0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
164d0 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
164e0 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
164f0 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
16500 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
16510 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
16520 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
16530 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
16540 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
16550 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a  Mem++;.    u++;.
16560 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
16570 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
16580 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
16590 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a  ield = u;.}../*.
165a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
165b0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
165c0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
165d0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
165e0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
165f0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
16600 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
16610 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
16620 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
16630 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
16640 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
16650 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
16660 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
16670 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
16680 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
16690 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
166a0 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50  created by th OP
166b0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
166c0 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20  de of the VDBE. 
166d0 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b   The pPKey2.** k
166e0 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72  ey must be a par
166f0 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20  sed key such as 
16700 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
16710 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73   sqlite3VdbePars
16720 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b  eRecord..**.** K
16730 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
16740 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
16750 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
16760 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a  ber of fields..*
16770 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66  * The key with f
16780 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75  ewer fields is u
16790 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20  sually compares 
167a0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a  less than the .*
167b0 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48  * longer key.  H
167c0 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e  owever if the UN
167d0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66  PACKED_INCRKEY f
167e0 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69  lags in pPKey2 i
167f0 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65  s set.** and the
16800 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
16810 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
16820 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16830 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69  an key2..** Or i
16840 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d  f the UNPACKED_M
16850 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67  ATCH_PREFIX flag
16860 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
16870 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20  prefixes are.** 
16880 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  equal, then the 
16890 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65  keys are conside
168a0 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20  red to be equal 
168b0 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73  and.** the parts
168c0 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d   beyond the comm
168d0 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67  on prefix are ig
168e0 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
168f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
16900 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
16910 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
16920 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
16930 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
16940 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
16950 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
16960 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
16970 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
16980 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
16990 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
169a0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
169b0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
169c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
169d0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
169e0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
169f0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
16a00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16a10 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
16a20 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
16a30 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
16a40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
16a50 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16a60 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
16a70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16a80 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
16a90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16aa0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
16ab0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
16ac0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
16ad0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
16ae0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
16af0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
16b00 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
16b10 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
16b20 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
16b30 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
16b40 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
16b50 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
16b60 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
16b70 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
16b80 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16b90 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
16ba0 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
16bb0 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
16bc0 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
16bd0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16be0 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
16bf0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
16c00 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
16c10 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
16c20 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
16c30 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
16c40 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
16c50 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
16c60 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
16c70 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
16c80 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
16c90 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
16ca0 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
16cb0 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
16cc0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
16cd0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
16ce0 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
16cf0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
16d00 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
16d10 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16d20 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16d30 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
16d40 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
16d50 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
16d60 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
16d70 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
16d80 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
16d90 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
16da0 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
16db0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
16dc0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
16dd0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
16de0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
16df0 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
16e00 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
16e10 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
16e20 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
16e30 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
16e40 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
16e50 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
16e60 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
16e70 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
16e80 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
16e90 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
16ea0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
16eb0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  1 );.    if( d1>
16ec0 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65  =nKey1 && sqlite
16ed0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
16ee0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
16ef0 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
16f00 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
16f10 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
16f20 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
16f30 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
16f40 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
16f50 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
16f60 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
16f70 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
16f80 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
16f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16fa0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
16fb0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
16fc0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16fe0 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
16ff0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
17000 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
17010 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17020 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
17030 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
17040 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20  ment below */.. 
17050 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74       /* Invert t
17060 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20  he result if we 
17070 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73  are using DESC s
17080 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
17090 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
170a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
170b0 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79  i<nField && pKey
170c0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
170d0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
170e0 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
170f0 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  .    .      /* I
17100 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41  f the PREFIX_SEA
17110 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20  RCH flag is set 
17120 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65  and all fields e
17130 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a  xcept the final.
17140 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66        ** rowid f
17150 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c  ield were equal,
17160 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20   then clear the 
17170 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
17180 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20  ag and set .    
17190 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77    ** pPKey2->row
171a0 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  id to the value 
171b0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  of the rowid fie
171c0 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b  ld in (pKey1, nK
171d0 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ey1)..      ** T
171e0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
171f0 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
17200 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  pcode..      */.
17210 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79        if( (pPKey
17220 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
17230 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43  KED_PREFIX_SEARC
17240 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32  H) && i==(pPKey2
17250 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20  ->nField-1) ){. 
17260 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
17270 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72  dx1==szHdr1 && r
17280 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c );.        ass
17290 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20  ert( mem1.flags 
172a0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
172b0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61       pPKey2->fla
172c0 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f  gs &= ~UNPACKED_
172d0 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20  PREFIX_SEARCH;. 
172e0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72         pPKey2->r
172f0 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b  owid = mem1.u.i;
17300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
17310 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17320 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
17330 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  }..  /* No memor
17340 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
17350 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
17360 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
17370 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
17380 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
17390 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
173a0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
173b0 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
173c0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
173d0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
173e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
173f0 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
17400 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
17410 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
17420 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
17430 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
17440 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
17450 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
17460 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
17470 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
17480 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
17490 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
174a0 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61  INCRKEY.  ** fla
174b0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62  g is set, then b
174c0 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20  reak the tie by 
174d0 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73  treating key2 as
174e0 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66   larger..  ** If
174f0 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45   the UPACKED_PRE
17500 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69  FIX_MATCH flag i
17510 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73  s set, then keys
17520 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65   with common pre
17530 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63  fixes.  ** are c
17540 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
17550 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  equal.  Otherwis
17560 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65  e, the longer ke
17570 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c  y is the .  ** l
17580 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61  arger.  As it ha
17590 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79  ppens, the pPKey
175a0 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
175b0 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a   the longer.  **
175c0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
175d0 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
175e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
175f0 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  );.  if( pPKey2-
17600 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17610 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20  D_INCRKEY ){.   
17620 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73   rc = -1;.  }els
17630 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c  e if( pPKey2->fl
17640 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
17650 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20  REFIX_MATCH ){. 
17660 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d     /* Leave rc==
17670 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  0 */.  }else if(
17680 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a   idx1<szHdr1 ){.
17690 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
176a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
176b0 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
176c0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
176d0 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
176e0 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
176f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
17700 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
17710 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
17720 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
17730 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
17740 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
17750 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
17760 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
17770 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
17780 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
17790 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
177a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
177b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
177c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
177d0 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
177e0 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
177f0 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
17800 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
17810 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
17820 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
17830 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
17840 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
17850 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
17860 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
17870 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
17880 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
17890 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
178a0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
178b0 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
178c0 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
178d0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
178e0 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
178f0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
17900 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
17910 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
17920 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17930 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65  ER(db);..  /* Ge
17940 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
17950 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
17960 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
17970 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
17980 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
17990 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
179a0 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
179b0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
179c0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
179d0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
179e0 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
179f0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
17a00 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
17a10 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
17a20 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
17a30 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
17a40 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
17a50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17a60 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
17a70 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
17a80 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
17a90 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
17aa0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
17ab0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
17ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
17ad0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
17ae0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
17af0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
17b00 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
17b10 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
17b20 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
17b30 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
17b40 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
17b50 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
17b60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17b70 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  try */.  memset(
17b80 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
17b90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17ba0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
17bb0 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  e(pCur, 0, (int)
17bc0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
17bd0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
17be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17bf0 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
17c00 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
17c10 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
17c20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
17c30 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
17c40 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
17c50 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
17c60 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
17c70 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
17c80 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
17c90 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
17ca0 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
17cb0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
17cc0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
17cd0 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
17ce0 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
17cf0 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
17d00 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
17d10 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
17d20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
17d30 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
17d40 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
17d50 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
17d60 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
17d70 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
17d80 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
17d90 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
17da0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
17db0 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
17dc0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17dd0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
17de0 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
17df0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
17e00 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
17e10 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
17e20 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
17e30 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17e40 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
17e50 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
17e60 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17e70 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
17e80 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
17e90 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
17ea0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
17eb0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
17ec0 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
17ed0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17ee0 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
17ef0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
17f00 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
17f10 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
17f20 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
17f30 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
17f40 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
17f50 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
17f60 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
17f70 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
17f80 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
17f90 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
17fa0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
17fb0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
17fc0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
17fd0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
17fe0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
17ff0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
18000 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18010 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
18020 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
18030 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
18040 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
18050 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
18060 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
18070 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
18080 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
18090 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
180a0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
180b0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
180c0 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
180d0 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  .zMalloc!=0 );. 
180e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
180f0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
18100 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18110 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
18120 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
18130 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
18140 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
18150 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
18160 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
18170 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
18180 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
18190 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
181a0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
181b0 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
181c0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
181d0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
181e0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
181f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
18200 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
18210 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18220 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
18230 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
18240 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
18250 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
18260 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
18270 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
18280 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
18290 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
182a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
182b0 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
182c0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
182d0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
182e0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
182f0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
18300 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
18310 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
18320 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
18330 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
18340 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18350 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
18360 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  e(.  VdbeCursor 
18370 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
18380 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
18390 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
183a0 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
183b0 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
183c0 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ,  /* Unpacked v
183d0 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f  ersion of key to
183e0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
183f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
18420 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
18430 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
18440 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
18450 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
18460 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
18470 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
18480 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
18490 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
184a0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
184b0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
184c0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
184d0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
184e0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
184f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18500 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
18510 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
18520 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
18530 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
18540 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
18550 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
18560 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
18570 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79  cause of the say
18580 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
18590 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
185a0 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
185b0 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
185c0 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
185d0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
185e0 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
185f0 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
18600 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
18610 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18620 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  KPT;.  }.  memse
18630 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
18640 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
18650 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
18660 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
18670 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
18680 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
18690 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
186a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
186b0 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66  rt( pUnpacked->f
186c0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
186d0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a  PREFIX_MATCH );.
186e0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
186f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
18700 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
18710 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
18720 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
18730 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
18740 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18750 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
18760 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
18770 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
18780 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
18790 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
187a0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
187b0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
187c0 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
187d0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
187e0 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
187f0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
18800 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18810 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
18820 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
18830 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
18840 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
18850 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
18860 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
18870 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
18880 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
18890 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
188a0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
188b0 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
188c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
188d0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
188e0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
188f0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
18900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
18910 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
18920 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
18930 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
18940 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
18950 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
18960 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
18970 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
18980 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
18990 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
189a0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
189b0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
189c0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
189d0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
189e0 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
189f0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
18a00 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
18a10 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
18a20 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
18a30 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
18a40 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
18a50 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
18a60 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
18a70 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
18a80 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
18a90 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
18aa0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
18ab0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
18ac0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
18ad0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
18ae0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
18af0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
18b00 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
18b10 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
18b20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
18b30 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
18b40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18b50 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
18b60 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
18b70 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
18b80 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
18b90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
18ba0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
18bb0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
18bc0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
18bd0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
18be0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
18bf0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
18c00 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
18c10 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
18c20 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
18c30 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
18c40 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
18c50 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
18c60 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
18c70 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
18c80 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
18c90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18ca0 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
18cb0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
18cc0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
18cd0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
18ce0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
18cf0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
18d00 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
18d10 62 65 47 65 74 56 61 6c 75 65 28 56 64 62 65 20  beGetValue(Vdbe 
18d20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
18d30 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
18d40 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
18d50 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
18d60 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
18d70 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
18d80 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
18d90 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
18da0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
18db0 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
18dc0 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
18dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
18de0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18df0 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
18e00 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
18e10 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
18e20 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
18e30 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
18e40 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
18e50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18e60 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28  beMemStoreType((
18e70 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20  Mem *)pRet);.   
18e80 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
18e90 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20  n pRet;.    }.  
18ea0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
18eb0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
18ec0 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56   SQL variable iV
18ed0 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69  ar so that bindi
18ee0 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74  ng a new value t
18ef0 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20  o it signals.** 
18f00 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74  to sqlite3_reopt
18f10 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d  imize() that re-
18f20 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
18f30 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75  atement may resu
18f40 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65  lt.** in a bette
18f50 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f  r query plan..*/
18f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18f70 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65  eSetVarmask(Vdbe
18f80 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a   *v, int iVar){.
18f90 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
18fa0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33   );.  if( iVar>3
18fb0 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  2 ){.    v->expm
18fc0 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66  ask = 0xffffffff
18fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
18fe0 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
18ff0 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
19000 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  );.  }.}..#ifdef
19010 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
19020 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
19030 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
19040 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
19050 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
19060 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
19070 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
19080 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
19090 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
190a0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
190b0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
190c0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
190d0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
190e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
190f0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
19100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
19110 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
19120 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
19130 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
19140 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
19150 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
19160 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
19170 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
19180 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
19190 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
191a0 20 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65   *db, UnpackedRe
191b0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
191c0 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
191d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
191e0 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
191f0 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
19200 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  = &p->aMem[i];. 
19210 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
19220 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
19230 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
19240 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
19250 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19260 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
19270 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
19280 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
19290 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
192a0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
192b0 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
192c0 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
192d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
192e0 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
192f0 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
19300 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
19310 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
19320 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
19330 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
19340 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
19350 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
19360 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
19370 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
19380 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
19390 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
193a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
193b0 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
193c0 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
193f0 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
19400 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
19410 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19430 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
19440 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
19450 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
19480 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
19490 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
194a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
194c0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
194d0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
19500 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
19510 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
19520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19530 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
19540 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
19570 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
19580 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
19590 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
195a0 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
195b0 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
195c0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
195d0 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
195e0 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ame;..  assert( 
195f0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
19600 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
19610 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
19620 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
19630 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  .  if( op==SQLIT
19640 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
19650 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b  iKey2 = v->aMem[
19660 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c  iReg].u.i;.  }el
19670 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20  se{.    iKey2 = 
19680 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  iKey1;.  }..  as
19690 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
196a0 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
196b0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
196c0 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
196d0 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
196e0 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
196f0 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
19700 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
19710 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
19720 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
19730 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
19740 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
19750 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
19760 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
19770 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
19780 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
19790 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
197a0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
197b0 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43  Field = pTab->nC
197c0 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  ol;.  preupdate.
197d0 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey1 = iKey1;. 
197e0 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32   preupdate.iKey2
197f0 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75   = iKey2;.  preu
19800 70 64 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54  pdate.iPKey = pT
19810 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62  ab->iPKey;..  db
19820 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
19830 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
19840 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
19850 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
19860 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
19870 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
19880 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
19890 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
198a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
198b0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
198c0 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
198d0 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
198e0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
198f0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
19900 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
19910 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
19920 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64  d);.  if( preupd
19930 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20  ate.aNew ){.    
19940 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
19950 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65  =0; i<pCsr->nFie
19960 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
19970 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
19980 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65  lease(&preupdate
19990 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  .aNew[i]);.    }
199a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
199b0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
199c0 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
199d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
199e0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
199f0 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.