/ Hex Artifact Content
Login

Artifact 6b9da05a16fbb52afd2bf0b3080087afdf16b6eb:


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 2d 3e 69 73 50 72 65  return (p->isPre
0720: 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a 53 71 6c  pareV2 ? p->zSql
0730: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
0740: 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  Swap all content
0750: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42   between two VDB
0760: 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  E structures..*/
0770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0780: 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20  eSwap(Vdbe *pA, 
0790: 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62  Vdbe *pB){.  Vdb
07a0: 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20  e tmp, *pTmp;.  
07b0: 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 6d  char *zTmp;.  tm
07c0: 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d  p = *pA;.  *pA =
07d0: 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d   *pB;.  *pB = tm
07e0: 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e  p;.  pTmp = pA->
07f0: 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65  pNext;.  pA->pNe
0800: 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a  xt = pB->pNext;.
0810: 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54    pB->pNext = pT
0820: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0830: 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50  >pPrev;.  pA->pP
0840: 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b  rev = pB->pPrev;
0850: 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70  .  pB->pPrev = p
0860: 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41  Tmp;.  zTmp = pA
0870: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53  ->zSql;.  pA->zS
0880: 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20  ql = pB->zSql;. 
0890: 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70   pB->zSql = zTmp
08a0: 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72  ;.  pB->isPrepar
08b0: 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70  eV2 = pA->isPrep
08c0: 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65 66  areV2;.}..#ifdef
08d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
08e0: 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67  .** Turn tracing
08f0: 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f   on or off.*/.vo
0900: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  id sqlite3VdbeTr
0910: 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c  ace(Vdbe *p, FIL
0920: 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e  E *trace){.  p->
0930: 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d  trace = trace;.}
0940: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0950: 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61  esize the Vdbe.a
0960: 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  Op array so that
0970: 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20   it is at least 
0980: 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68  one op larger th
0990: 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a  an .** it was..*
09a0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f  *.** If an out-o
09b0: 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f  f-memory error o
09c0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69  ccurs while resi
09d0: 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20  zing the array, 
09e0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
09f0: 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20  _NOMEM. In this 
0a00: 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e  case Vdbe.aOp an
0a10: 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20  d Vdbe.nOpAlloc 
0a20: 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61  remain .** uncha
0a30: 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f  nged (this is so
0a40: 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65   that any opcode
0a50: 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61  s already alloca
0a60: 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63  ted can be .** c
0a70: 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63  orrectly dealloc
0a80: 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
0a90: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0aa0: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0ab0: 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79   int growOpArray
0ac0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62  (Vdbe *p){.  Vdb
0ad0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  eOp *pNew;.  int
0ae0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0af0: 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c  lloc ? p->nOpAll
0b00: 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32  oc*2 : (int)(102
0b10: 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a  4/sizeof(Op)));.
0b20: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0b30: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0b40: 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   p->aOp, nNew*si
0b50: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0b60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0b70: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  nOpAlloc = sqlit
0b80: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
0b90: 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65  ->db, pNew)/size
0ba0: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61  of(Op);.    p->a
0bb0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
0bc0: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
0bd0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
0be0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a  TE_NOMEM);.}../*
0bf0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
0c00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
0c10: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
0c20: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
0c30: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
0c40: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
0c50: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
0c60: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
0c70: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
0c80: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
0c90: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0ca0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
0cb0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
0cc0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
0cd0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
0ce0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
0cf0: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
0d00: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
0d10: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
0d20: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
0d30: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
0d40: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
0d50: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
0d60: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
0d70: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
0d80: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
0d90: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e  * operand..*/.in
0da0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0db0: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
0dc0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
0dd0: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
0de0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
0df0: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
0e00: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
0e10: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
0e20: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
0e30: 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70  sert( op>0 && op
0e40: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70  <0xff );.  if( p
0e50: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b  ->nOpAlloc<=i ){
0e60: 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41  .    if( growOpA
0e70: 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20  rray(p) ){.     
0e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
0e90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b  .  }.  p->nOp++;
0ea0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
0eb0: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  [i];.  pOp->opco
0ec0: 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70  de = (u8)op;.  p
0ed0: 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f  Op->p5 = 0;.  pO
0ee0: 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f  p->p1 = p1;.  pO
0ef0: 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f  p->p2 = p2;.  pO
0f00: 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f  p->p3 = p3;.  pO
0f10: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70  p->p4.p = 0;.  p
0f20: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
0f30: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78  NOTUSED;.  p->ex
0f40: 70 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  pired = 0;.#ifde
0f50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
0f60: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
0f70: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
0f80: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0f90: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
0fa0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0fb0: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
0fc0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
0fd0: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
0fe0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
0ff0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1000: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1020: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1030: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1050: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1070: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1080: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1090: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10a0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
10b0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
10c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
10d0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
10e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
10f0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1110: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1120: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1130: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1140: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1150: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1160: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1180: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1190: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
11a0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
11b0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
11e0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1200: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1210: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1220: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1230: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1250: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1260: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1270: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1280: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1290: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
12a0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
12b0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
12c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
12d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
12e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
12f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1300: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1310: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1320: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1330: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1340: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1350: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1360: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1370: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1380: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
1390: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13a0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
13b0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
13c0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
13d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
13e0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
13f0: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1400: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1410: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1430: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1440: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1460: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1470: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
1480: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1490: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
14a0: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
14b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
14d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
14e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
14f0: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
1500: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
1510: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
1520: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
1530: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1540: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1550: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1560: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1570: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1580: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1590: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
15a0: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
15b0: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
15c0: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
15d0: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
15e0: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
15f0: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1600: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
1610: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
1620: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
1630: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
1640: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
1650: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1660: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1670: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1680: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1690: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
16a0: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
16b0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
16c0: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
16d0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
16e0: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
16f0: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1700: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
1710: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
1720: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
1730: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
1740: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
1750: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1770: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1780: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1790: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
17a0: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
17b0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
17d0: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
17e0: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
17f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1800: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1810: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
1820: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
1830: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
1840: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
1850: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1860: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1870: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1880: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
18b0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
18c0: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
18d0: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
18e0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
18f0: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
1900: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1910: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
1920: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1930: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
1940: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1950: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1960: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1970: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1980: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1990: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
19a0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
19b0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
19c0: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
19d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
19e0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
19f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a00: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1a10: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a20: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1a30: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1a40: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1a50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1a60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1a70: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1a80: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1a90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1aa0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1ab0: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1ac0: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
1ad0: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1ae0: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1af0: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1b00: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1b10: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1b20: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1b30: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1b40: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1b50: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1b60: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1b70: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1b80: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1b90: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1ba0: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1bb0: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1bc0: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1bd0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1be0: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1bf0: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1c00: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1c10: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1c20: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1c30: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1c60: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1c70: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1c80: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1c90: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1ca0: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1cb0: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1cc0: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1cd0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1ce0: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1cf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1d00: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1d10: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1d20: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1d30: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1d40: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1d50: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1d60: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
1d70: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
1d80: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
1d90: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
1da0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
1db0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1de0: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
1df0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
1e00: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1e10: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
1e20: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
1e30: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e50: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
1e60: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
1e70: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
1e80: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
1e90: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
1ea0: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
1eb0: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
1ec0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
1ed0: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
1ee0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
1ef0: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
1f00: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
1f10: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
1f20: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
1f30: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
1f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
1f50: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
1f60: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
1f70: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
1f80: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
1f90: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
1fa0: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
1fb0: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
1fc0: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
1fd0: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
1fe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
1ff0: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
2000: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
2010: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
2020: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
2030: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
2040: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2050: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2060: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2070: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
2080: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2090: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
20a0: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
20b0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
20c0: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
20d0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
20e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20f0: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
2100: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
2110: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
2120: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
2130: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
2140: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2150: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2160: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2170: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
2180: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
2190: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
21a0: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
21b0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
21c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21d0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
21e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
21f0: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
2200: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
2210: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2220: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
2230: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
2240: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2250: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2260: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2270: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
2280: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
2290: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
22a0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
22b0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
22c0: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
22d0: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
22e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
2300: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
2310: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2320: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2330: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
2340: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2350: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2360: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2370: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
2380: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
2390: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
23a0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
23b0: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
23c0: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
23d0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
23e0: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
23f0: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
2400: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
2410: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
2420: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
2430: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
2440: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2450: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2460: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2470: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
2480: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
2490: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
24a0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
24b0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
24c0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
24d0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
24e0: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
24f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
2500: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
2510: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
2520: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
2530: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
2540: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2550: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2560: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2570: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
2580: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
2590: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
25a0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
25b0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
25c0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
25d0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
25e0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
25f0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2600: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
2610: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
2620: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
2630: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
2640: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2650: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2660: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2680: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
2690: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
26a0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
26b0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
26c0: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
26d0: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
26e0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
26f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
2700: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
2710: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
2720: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2730: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2740: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2750: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2770: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
2780: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2790: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
27a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
27b0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
27c0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
27d0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
27e0: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
27f0: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2800: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2810: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2820: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2830: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2840: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2850: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2860: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2870: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2880: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2890: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
28a0: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
28b0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
28c0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
28d0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
28e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
28f0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2900: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2910: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2920: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2930: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2940: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2950: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2960: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2970: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2980: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2990: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
29a0: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
29b0: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
29c0: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
29d0: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
29e0: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
29f0: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2a00: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2a10: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2a20: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a30: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2a40: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2a50: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2a60: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2a70: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2a80: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2a90: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2aa0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2ab0: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2ac0: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2ad0: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2ae0: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2af0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2b00: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2b10: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2b20: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2b30: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2b40: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2b50: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2b60: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2b70: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2b80: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2b90: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2ba0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2bb0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2bc0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2bd0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2be0: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2bf0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2c00: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2c10: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2c20: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2c30: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2c40: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2c50: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2c60: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2c70: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2c80: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2c90: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2ca0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2cb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2cc0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2cd0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2ce0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cf0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73  opcode==OP_Trans
2d00: 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70  action && pOp->p
2d10: 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  2!=0 ){.      p-
2d20: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23  >readOnly = 0;.#
2d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
2d60: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2d70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2d80: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
2d90: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2da0: 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p2;.    }else i
2db0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
2dc0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
2dd0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
2de0: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
2df0: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
2e00: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
2e10: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
2e20: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
2e30: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
2e40: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
2e50: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
2e60: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2e70: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
2e80: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
2e90: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
2ea0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2eb0: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
2ec0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
2ed0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
2ee0: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
2ef0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2f00: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
2f10: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
2f20: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
2f30: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
2f40: 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  axArgs;.}../*.**
2f50: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
2f60: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2f70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2f80: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
2f90: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
2fa0: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
2fb0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
2fc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2fd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
2fe0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
2ff0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3000: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
3010: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
3020: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
3030: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
3040: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
3050: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
3060: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
3070: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
3080: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
3090: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
30a0: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
30b0: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
30c0: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
30d0: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
30e0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
30f0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
3100: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
3110: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3120: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
3130: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
3140: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
3150: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
3160: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
3170: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
3180: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
3190: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
31a0: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
31b0: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
31c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
31d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
31e0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
31f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
3200: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
3210: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
3220: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
3230: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
3240: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
3250: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
3260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
3270: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
3280: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3290: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
32a0: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
32b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  /.  assert( p->a
32c0: 4d 75 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30 20  Mutex.nMutex==0 
32d0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
32e0: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
32f0: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
3300: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
3310: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
3320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
3330: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
3340: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
3350: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
3360: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
3370: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3380: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
3390: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
33a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
33b0: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
33c0: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
33d0: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
33e0: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
33f0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
3400: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
3410: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
3420: 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  Op > p->nOpAlloc
3430: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
3440: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
3450: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
3460: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41   p->nOp;.  if( A
3470: 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a  LWAYS(nOp>0) ){.
3480: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
3490: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
34a0: 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20  *pIn = aOp;.    
34b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
34c0: 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20  i++, pIn++){.   
34d0: 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d     int p2 = pIn-
34e0: 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  >p2;.      VdbeO
34f0: 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f  p *pOut = &p->aO
3500: 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20  p[i+addr];.     
3510: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
3520: 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pIn->opcode;.   
3530: 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49     pOut->p1 = pI
3540: 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28  n->p1;.      if(
3550: 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65   p2<0 && (sqlite
3560: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3570: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
3580: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29  OPFLG_JUMP)!=0 )
3590: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
35a0: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
35b0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
35c0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
35d0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
35e0: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
35f0: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
3600: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
3610: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3620: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
3630: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
3640: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
3650: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
3660: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
3670: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
3680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
3690: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
36a0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
36b0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
36c0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
36d0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
36f0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
3700: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
3710: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3720: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
3730: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3740: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3750: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3760: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
3770: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
3780: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
3790: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
37a0: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
37b0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
37c0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
37d0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
37e0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
37f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
3800: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3810: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP1(Vdbe *p, in
3820: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
3830: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
3850: 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  dr>=0 );.  if( p
3860: 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20  ->nOp>addr ){.  
3870: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3880: 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  1 = val;.  }.}..
3890: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
38a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32   value of the P2
38b0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
38c0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
38d0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
38e0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66  tine is useful f
38f0: 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d  or setting a jum
3900: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a  p destination..*
3910: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3920: 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20  beChangeP2(Vdbe 
3930: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3940: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3950: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
3960: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
3970: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
3980: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3990: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
39a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
39b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
39c0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
39d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
39e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
39f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3a00: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3a10: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
3a20: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3a30: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3a40: 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28  addr>=0 );.  if(
3a50: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a   p->nOp>addr ){.
3a60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3a70: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
3a80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3aa0: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
3ab0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
3ac0: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
3ad0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3ae0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
3af0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
3b00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3b10: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  0 );.  if( p->aO
3b20: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
3b30: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
3b40: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
3b50: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
3b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3b70: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
3b80: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
3b90: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
3ba0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
3bb0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3bc0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3bd0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
3be0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
3bf0: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
3c00: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
3c10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3c20: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
3c30: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
3c40: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
3c50: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
3c60: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
3c70: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
3c80: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
3c90: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
3ca0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
3cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
3cc0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
3cd0: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
3ce0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
3cf0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
3d00: 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61  f) && (pDef->fla
3d10: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
3d20: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
3d30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d40: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
3d50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3d60: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
3d70: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
3d80: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
3d90: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
3da0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
3db0: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
3dc0: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
3dd0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
3de0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
3df0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
3e00: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
3e10: 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  TF:.      case P
3e20: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
3e30: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
3e40: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3e50: 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20  INTARRAY:.      
3e60: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
3e70: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
3e80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3e90: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
3ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3eb0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
3ec0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
3ed0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
3ee0: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
3ef0: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
3f00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3f10: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
3f20: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
3f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3f40: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
3f50: 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20  VdbeFunc, 0);.  
3f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3f70: 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e  ree(db, pVdbeFun
3f80: 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  c);.        brea
3f90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3fa0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
3fb0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
3fc0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3fd0: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
3fe0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3ff0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4000: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4020: 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74  ValueFree((sqlit
4030: 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20  e3_value*)p4);. 
4040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4050: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4060: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
4070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
4080: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
4090: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
40a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
40b0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
40c0: 4f 47 52 41 4d 20 3a 20 7b 0a 20 20 20 20 20 20  OGRAM : {.      
40d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 6f    sqlite3VdbePro
40e0: 67 72 61 6d 44 65 6c 65 74 65 28 64 62 2c 20 28  gramDelete(db, (
40f0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 29 70 34 2c  SubProgram *)p4,
4100: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
4110: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4120: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4130: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4140: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4150: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4160: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4170: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4180: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4190: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
41a0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
41b0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
41c0: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
41d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
41e0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
41f0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4200: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4210: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4220: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4230: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4240: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4250: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4260: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4270: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4280: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4290: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
42a0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
42b0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
42c0: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
42d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
42e0: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  aOp);.}../*.** D
42f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
4300: 2d 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 53 75  -count on the Su
4310: 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75  bProgram structu
4320: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
4330: 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
4340: 65 6e 74 2e 20 49 66 20 74 68 65 20 72 65 66 2d  ent. If the ref-
4350: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
4360: 72 6f 2c 20 66 72 65 65 20 74 68 65 20 73 74 72  ro, free the str
4370: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4380: 65 20 61 72 72 61 79 20 6f 66 20 56 44 42 45 20  e array of VDBE 
4390: 6f 70 63 6f 64 65 73 20 73 74 6f 72 65 64 20 61  opcodes stored a
43a0: 73 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  s SubProgram.aOp
43b0: 20 69 73 20 66 72 65 65 64 20 69 66 0a 2a 2a 20   is freed if.** 
43c0: 65 69 74 68 65 72 20 74 68 65 20 72 65 66 2d 63  either the ref-c
43d0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
43e0: 6f 20 6f 72 20 70 61 72 61 6d 65 74 65 72 20 66  o or parameter f
43f0: 72 65 65 6f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  reeop is non-zer
4400: 6f 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74  o..**.** Since t
4410: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
4420: 64 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  des pointed to b
4430: 79 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  y SubProgram.aOp
4440: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 0a 2a 2a   may directly.**
4450: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63   or indirectly c
4460: 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
4470: 63 65 20 74 6f 20 74 68 65 20 53 75 62 50 72 6f  ce to the SubPro
4480: 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 20 69  gram structure i
4490: 74 73 65 6c 66 2e 0a 2a 2a 20 42 79 20 70 61 73  tself..** By pas
44a0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  sing a non-zero 
44b0: 66 72 65 65 6f 70 20 70 61 72 61 6d 65 74 65 72  freeop parameter
44c0: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
44d0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
44e0: 0a 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 73  .** SubProgram s
44f0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
4500: 65 69 72 20 61 4f 70 20 61 72 72 61 79 73 20 61  eir aOp arrays a
4510: 72 65 20 66 72 65 65 64 2c 20 65 76 65 6e 20 77  re freed, even w
4520: 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
4530: 20 73 75 63 68 20 63 69 72 63 75 6c 61 72 20 72   such circular r
4540: 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2f 0a 76 6f  eferences..*/.vo
4550: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
4560: 6f 67 72 61 6d 44 65 6c 65 74 65 28 73 71 6c 69  ogramDelete(sqli
4570: 74 65 33 20 2a 64 62 2c 20 53 75 62 50 72 6f 67  te3 *db, SubProg
4580: 72 61 6d 20 2a 70 2c 20 69 6e 74 20 66 72 65 65  ram *p, int free
4590: 6f 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  op){.  if( p ){.
45a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
45b0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  Ref>0 );.    if(
45c0: 20 66 72 65 65 6f 70 20 7c 7c 20 70 2d 3e 6e 52   freeop || p->nR
45d0: 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 4f  ef==1 ){.      O
45e0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
45f0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20  .      p->aOp = 
4600: 30 3b 0a 20 20 20 20 20 20 76 64 62 65 46 72 65  0;.      vdbeFre
4610: 65 4f 70 41 72 72 61 79 28 64 62 2c 20 61 4f 70  eOpArray(db, aOp
4620: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 20  , p->nOp);.     
4630: 20 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 20   p->nOp = 0;.   
4640: 20 7d 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d   }.    p->nRef--
4650: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
4660: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  f==0 ){.      sq
4670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4680: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
4690: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
46a0: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
46b0: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
46c0: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
46d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
46e0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
46f0: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
4700: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4710: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4720: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4730: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4740: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68   = p->db;.    wh
4750: 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20  ile( N-- ){.    
4760: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4770: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4780: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
4790: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
47a0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
47b0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
47c0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
47d0: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
47e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
47f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4800: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4810: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4820: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4830: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4840: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4850: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4860: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4870: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4890: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
48a0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
48b0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
48c0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
48d0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
48e0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
48f0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4900: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4910: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4920: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4930: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4940: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4950: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4960: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4970: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4980: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4990: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
49a0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
49b0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
49c0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
49d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
49e0: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
49f0: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4a00: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4a10: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4a20: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4a30: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4a40: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4a50: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4a60: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4a70: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4a80: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4a90: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4aa0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4ab0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4ac0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4ad0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4ae0: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4af0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4b00: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4b20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4b30: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4b40: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4b50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4b60: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4b70: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4b80: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4b90: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4ba0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4bb0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4bc0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4bd0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4be0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4bf0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4c00: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4c10: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4c20: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4c30: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4c40: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4c50: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4c60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4c70: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4c80: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4c90: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4ca0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4cb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4cc0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4cd0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4ce0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4cf0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4d20: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4d30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4d40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4d50: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4d60: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4d70: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4d80: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4d90: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4da0: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4db0: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4dc0: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4dd0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4de0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4df0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4e00: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4e10: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4e20: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4e30: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4e40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4e50: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4e60: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4e70: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
4e80: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4e90: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
4ea0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
4eb0: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
4ec0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
4ed0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
4ee0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
4ef0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
4f00: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
4f10: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
4f20: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
4f30: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
4f40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4f50: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
4f60: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
4f70: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
4f80: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
4f90: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
4fa0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
4fb0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
4fc0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
4fd0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
4fe0: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
4ff0: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5000: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
5010: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
5020: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
5030: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
5040: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
5050: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
5060: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5070: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  fo = sqlite3Mall
5080: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
5090: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
50a0: 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
50b0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
50c0: 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72  {.      u8 *aSor
50d0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65  tOrder;.      me
50e0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
50f0: 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P4, nByte);.    
5100: 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    aSortOrder = p
5110: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5120: 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61  der;.      if( a
5130: 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  SortOrder ){.   
5140: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
5150: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
5160: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
5170: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
5180: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  eld];.        me
5190: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  mcpy(pKeyInfo->a
51a0: 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74  SortOrder, aSort
51b0: 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a  Order, nField);.
51c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
51d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
51e0: 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73  EYINFO;.    }els
51f0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  e{.      p->db->
5200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
5210: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
5220: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
5240: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
5250: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
5260: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
5270: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5280: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5290: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
52a0: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b  f( n==P4_VTAB ){
52b0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
52c0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
52d0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
52e0: 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69  4_VTAB;.    sqli
52f0: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
5300: 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20  ble *)zP4);.    
5310: 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65  assert( ((VTable
5320: 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e   *)zP4)->db==p->
5330: 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  db );.  }else if
5340: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
5350: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
5360: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
5370: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
5380: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
5390: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
53a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
53b0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
53c0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
53d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
53e0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
53f0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
5400: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
5410: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
5420: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
5430: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68  omment on the th
5440: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
5450: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
5460: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
5470: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
5480: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
5490: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
54a0: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
54b0: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
54c0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
54d0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
54e0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
54f0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
5500: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
5510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5520: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
5530: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5540: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5550: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5560: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5570: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5580: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
55a0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
55b0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
55c0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
55d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
55e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
55f0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
5600: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
5610: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ].zComment;.    
5620: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5630: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
5640: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5650: 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20  *pz);.    *pz = 
5660: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
5670: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
5680: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
5690: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
56a0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
56b0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
56c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
56d0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
56e0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
56f0: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  p ) return;.  sq
5700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5710: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61  p, OP_Noop);.  a
5720: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
5730: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
5740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5750: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
5760: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5770: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5780: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5790: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
57a0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
57b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
57c0: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
57d0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
57e0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
57f0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
5800: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
5810: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
5820: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
5830: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
5840: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
5850: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
5860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5870: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
5880: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
5890: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
58a0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
58b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
58c0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
58d0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
58e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
58f0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
5900: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
5910: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
5920: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
5930: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
5940: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
5950: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
5960: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
5970: 20 69 73 20 72 65 61 64 61 62 6c 65 20 61 6e 64   is readable and
5980: 20 77 72 69 74 61 62 6c 65 2c 20 62 75 74 20 69   writable, but i
5990: 74 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e  t has no effect.
59a0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20    The return of 
59b0: 61 20 64 75 6d 6d 79 0a 2a 2a 20 6f 70 63 6f 64  a dummy.** opcod
59c0: 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c  e allows the cal
59d0: 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75  l to continue fu
59e0: 6e 63 74 69 6f 6e 69 6e 67 20 61 66 74 65 72 20  nctioning after 
59f0: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  a OOM fault with
5a00: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5a10: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
5a20: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
5a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5a40: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5a50: 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68  ..**.** About th
5a60: 65 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  e #ifdef SQLITE_
5a70: 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72  OMIT_TRACE:  Nor
5a80: 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74  mally, this rout
5a90: 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
5aa0: 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d  led.** unless p-
5ab0: 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73  >nOp>0.  This is
5ac0: 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20   because in the 
5ad0: 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54  absense of SQLIT
5ae0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a  E_OMIT_TRACE,.**
5af0: 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73   an OP_Trace ins
5b00: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61  truction is alwa
5b10: 79 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73  ys inserted by s
5b20: 71 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20  qlite3VdbeGet() 
5b30: 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20  as soon as.** a 
5b40: 6e 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61  new VDBE is crea
5b50: 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20  ted.  So we are 
5b60: 66 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72  free to set addr
5b70: 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74   to p->nOp-1 wit
5b80: 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74  hout.** having t
5b90: 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  o double-check t
5ba0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
5bb0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
5bc0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74  on-negative. But
5bd0: 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  .** if SQLITE_OM
5be0: 49 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69  IT_TRACE is defi
5bf0: 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63  ned, the OP_Trac
5c00: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  e is omitted and
5c10: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a   we do need to.*
5c20: 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75  * check the valu
5c30: 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65  e of p->nOp-1 be
5c40: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
5c50: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
5c60: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
5c70: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
5c80: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
5c90: 20 64 75 6d 6d 79 3b 0a 20 20 61 73 73 65 72 74   dummy;.  assert
5ca0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5cb0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5cc0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5ce0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
5cf0: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
5d00: 72 6e 20 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69  rn &dummy;.#endi
5d10: 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  f.    addr = p->
5d20: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
5d30: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
5d40: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
5d50: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
5d60: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
5d70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5d80: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
5d90: 6e 20 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  n &dummy;.  }els
5da0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
5db0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
5dc0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
5dd0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
5de0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
5df0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
5e00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
5e10: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
5e20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5e30: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
5e40: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
5e50: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
5e60: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
5e70: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
5e80: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
5e90: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
5ea0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
5eb0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
5ec0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
5ed0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
5ee0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
5ef0: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
5f00: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
5f10: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
5f20: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
5f30: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
5f40: 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20  NFO_STATIC:.    
5f50: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
5f60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
5f70: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
5f80: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
5f90: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
5fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5fb0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
5fc0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
5fd0: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
5fe0: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
5ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6000: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
6010: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
6020: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
6030: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6040: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
6050: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
6060: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
6070: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
6080: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6090: 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  n30(pColl->zName
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
60b0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
60d0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
60e0: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
60f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6110: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
6120: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
6130: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
6140: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
6150: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
6160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6170: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
6180: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6190: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
61a0: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
61b0: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
61c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
61d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
61e0: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
61f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6200: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
6210: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
6220: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
6230: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6240: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
6250: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
6260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6270: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
6280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6290: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
62a0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
62b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
62c0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
62e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
62f0: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
6300: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
6310: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
6320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6330: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
6340: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
6350: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
6360: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
6370: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6380: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
6390: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
63a0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
63b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
63c0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
63d0: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
63e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
63f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6400: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
6410: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6420: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6430: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
6440: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6450: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6460: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
6470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6490: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
64a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
64b0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
64c0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
64d0: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
64e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
64f0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
6500: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
6510: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
6520: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
6530: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
6540: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
6550: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6560: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
6570: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
6580: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
6590: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
65a0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
65b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
65c0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
65d0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
65e0: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
65f0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
6600: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
6610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6620: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6630: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
6640: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
6650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6660: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
6670: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
6680: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
6690: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
66a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
66b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
66c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
66d0: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
66e0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
66f0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
6700: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
6710: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
6720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6730: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6740: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
6750: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
6760: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
6770: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6780: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
6790: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
67a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
67b0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
67c0: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
67d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
67e0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
67f0: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
6800: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6810: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
6820: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
6830: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6840: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6850: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
6860: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6880: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
6890: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
68a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
68b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
68c0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
68d0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
68e0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
68f0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
6900: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
6910: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
6920: 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
6930: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6940: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6950: 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   i){.  int mask;
6960: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
6970: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
6980: 26 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29  && i<sizeof(u32)
6990: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
69a0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
69b0: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
69c0: 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29  .  mask = ((u32)
69d0: 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d  1)<<i;.  if( (p-
69e0: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
69f0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
6a00: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
6a10: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
6a20: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
6a30: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
6a40: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
6a50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
6a60: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
6a70: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
6a80: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6a90: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
6aa0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
6ab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6ac0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
6ad0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
6ae0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
6af0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
6b00: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
6b10: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
6b20: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
6b30: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6b40: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
6b50: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
6b60: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
6b70: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
6b80: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
6b90: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
6ba0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
6bb0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
6bc0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
6bd0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
6bf0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6c00: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
6c10: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
6c20: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
6c30: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6c40: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
6c50: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
6c60: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
6c70: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
6c80: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
6c90: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
6ca0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
6cb0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
6cc0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
6cd0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
6ce0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
6cf0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
6d00: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
6d10: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
6d20: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6d30: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
6d40: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
6d50: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f 72  cFailed;.    for
6d60: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
6d70: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
6d80: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
6d90: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
6da0: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20  b==p[1].db );.. 
6db0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
6dc0: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
6dd0: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
6de0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
6df0: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
6e00: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
6e10: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
6e20: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
6e30: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
6e40: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
6e50: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
6e60: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
6e70: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
6e80: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
6e90: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
6ea0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
6eb0: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
6ec0: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
6ed0: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
6ee0: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
6ef0: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
6f00: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
6f10: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
6f20: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
6f30: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
6f40: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
6f50: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
6f60: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
6f70: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
6f80: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
6f90: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
6fa0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
6fb0: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
6fc0: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
6fd0: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
6fe0: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
6ff0: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
7000: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
7010: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
7020: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
7030: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
7040: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
7050: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
7060: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
7070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7080: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7090: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
70a0: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
70b0: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
70c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
70d0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
70e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
70f0: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
7100: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7110: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7120: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7130: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
7140: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
7150: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
7160: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
7170: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7180: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7190: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
71a0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
71b0: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
71c0: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
71d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
71e0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
71f0: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7200: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7210: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7220: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7230: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7240: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7250: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7260: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7270: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7280: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7290: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
72a0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
72b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
72c0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
72d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
72e0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
72f0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7300: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7310: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7320: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7330: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7340: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7350: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7360: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7370: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7380: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7390: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
73a0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
73b0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
73c0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
73d0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
73e0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
73f0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
7400: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
7410: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
7420: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
7430: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
7440: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
7450: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
7460: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
7470: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
7480: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
7490: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
74a0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
74b0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
74c0: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
74d0: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
74e0: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
74f0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
7500: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
7510: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
7520: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
7530: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69  QUERY PLAN..*/.i
7540: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
7550: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
7580: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
75b0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
75c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
75d0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7600: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
7610: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
7620: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
7630: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7640: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
7650: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
7660: 20 2a 70 53 75 62 20 3d 20 30 3b 0a 20 20 73 71   *pSub = 0;.  sq
7670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
7680: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
7690: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
76a0: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
76b0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
76c0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20  &p->aMem[1];..  
76d0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
76e0: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
76f0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
7700: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
7710: 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d  sert( db->magic=
7720: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
7730: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
7740: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
7750: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
7760: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
7770: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
7780: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
7790: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
77a0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
77b0: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
77c0: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
77d0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
77e0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
77f0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
7800: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
7810: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
7820: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
7830: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
7840: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
7850: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
7860: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20  ray(pMem, 8);.. 
7870: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
7880: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
7890: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
78a0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
78b0: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
78c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
78d0: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
78e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
78f0: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
7900: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
7910: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7930: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
7940: 46 69 67 75 72 65 20 6f 75 74 20 74 6f 74 61 6c  Figure out total
7950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
7960: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
7970: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 0a 20  urned by this . 
7980: 20 2a 2a 20 45 58 50 4c 41 49 4e 20 70 72 6f 67   ** EXPLAIN prog
7990: 72 61 6d 2e 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ram.  */.  nRow 
79a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
79b0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
79c0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
79d0: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
79e0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
79f0: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 6e  _Blob ){.      n
7a00: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
7a10: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
7a20: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
7a30: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
7a40: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
7a50: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
7a60: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
7a70: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
7a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
7a90: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
7aa0: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
7ab0: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
7ac0: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
7ad0: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
7ae0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
7af0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
7b00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7b10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7b20: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
7b30: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
7b40: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
7b50: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
7b60: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
7b70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
7b80: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
7b90: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
7ba0: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
7bb0: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
7bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
7bd0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
7be0: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
7bf0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ->nOp ){.      p
7c00: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
7c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7c20: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
7c30: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
7c40: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
7c50: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
7c60: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
7c70: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
7c80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
7c90: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
7ca0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
7cb0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
7cc0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
7cd0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
7ce0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
7cf0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
7d00: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
7d10: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
7d40: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
7d50: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
7d60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
7d70: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
7d80: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
7d90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
7da0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
7db0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
7dc0: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
7dd0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
7de0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
7df0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
7e00: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7e10: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
7e20: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
7e30: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
7e40: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
7e50: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
7e60: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
7e70: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
7e80: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
7e90: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
7ea0: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
7eb0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
7ec0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
7ed0: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
7ee0: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
7ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7f00: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
7f10: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
7f20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7f30: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
7f40: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
7f50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
7f60: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
7f70: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
7f80: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
7f90: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
7fa0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
7fb0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
7fc0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
7fd0: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
7fe0: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
7ff0: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
8000: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
8010: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
8020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8030: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
8040: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
8050: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
8060: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
8090: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
80a0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
80b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
80c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
80d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
80e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
8110: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8120: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8130: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
8140: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
8150: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
8160: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
8170: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
8180: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
81b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
81c0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
81d0: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ER;.      pMem++
81e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
81f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
8200: 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29  row(pMem, 32, 0)
8210: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f   ){            /
8220: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
8230: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
8240: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
8250: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8270: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8280: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
8290: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20  MEM_Term;.    z 
82a0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
82b0: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
82c0: 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e     if( z!=pMem->
82d0: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
82e0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
82f0: 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pMem, z, -1, SQL
8300: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
8310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
8320: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
8330: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
8340: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
8350: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
8360: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
8370: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
8380: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79    }.    pMem->ty
8390: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
83a0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
83b0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
83c0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
83d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
83e0: 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29  Grow(pMem, 4, 0)
83f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
8400: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
8410: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
8420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8430: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
8440: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8450: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
8460: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
8470: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
8480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
8490: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
84a0: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
84b0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
84c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
84d0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
84e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
84f0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
8500: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
8510: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8520: 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70  EBUG.      if( p
8530: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
8540: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
8550: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
8560: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
8570: 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a  pMem->z = pOp->z
8580: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
8590: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
85a0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
85b0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
85c0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
85d0: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
85e0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
85f0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65  E_TEXT;.      }e
8600: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
8610: 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   {.        pMem-
8620: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
8630: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8640: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
8650: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ent */.        p
8660: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8670: 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_NULL;.      }
8680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
8690: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
86a0: 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  5*(p->explain-1)
86b0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
86c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
86d0: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
86e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
86f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8700: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
8710: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
8720: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
8730: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
8740: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
8750: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
8760: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
8770: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
8780: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
8790: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
87a0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
87b0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
87c0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
87d0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
87e0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
87f0: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
8800: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
8810: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
8820: 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28  p4.z;.    while(
8830: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
8840: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  *z) ) z++;.    p
8850: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
8860: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
8870: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
8880: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8890: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
88a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
88b0: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
88c0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
88d0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
88e0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
88f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8900: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
8910: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
8920: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
8930: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
8940: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
8950: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
8960: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
8970: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8980: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
8990: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
89a0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
89b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
89c0: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
89d0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
89e0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
89f0: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
8a00: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
8a10: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
8a20: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
8a30: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
8a40: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
8a50: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
8a60: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
8a70: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
8a80: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
8a90: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
8aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
8ac0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
8ad0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8ae0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
8af0: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
8b00: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
8b10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
8b20: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
8b30: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
8b40: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
8b50: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
8b60: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
8b70: 69 7a 65 20 62 75 66 66 65 72 2e 20 20 4d 61 6b  ize buffer.  Mak
8b80: 65 20 2a 70 70 20 70 6f 69 6e 74 20 74 6f 20 74  e *pp point to t
8b90: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  he.** allocated 
8ba0: 73 70 61 63 65 2e 20 20 28 4e 6f 74 65 3a 20 20  space.  (Note:  
8bb0: 70 70 20 69 73 20 61 20 63 68 61 72 2a 20 72 61  pp is a char* ra
8bc0: 74 68 65 72 20 74 68 61 6e 20 61 20 76 6f 69 64  ther than a void
8bd0: 2a 2a 20 74 6f 0a 2a 2a 20 77 6f 72 6b 20 61 72  ** to.** work ar
8be0: 6f 75 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72  ound the pointer
8bf0: 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 20   aliasing rules 
8c00: 6f 66 20 43 2e 29 20 20 2a 70 70 20 73 68 6f 75  of C.)  *pp shou
8c10: 6c 64 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20  ld initially.** 
8c20: 62 65 20 7a 65 72 6f 2e 20 20 49 66 20 2a 70 70  be zero.  If *pp
8c30: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
8c40: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
8c50: 65 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  e space has alre
8c60: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  ady.** been allo
8c70: 63 61 74 65 64 20 61 6e 64 20 74 68 69 73 20 72  cated and this r
8c80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 6f 70  outine is a noop
8c90: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
8ca0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8cb0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
8cc0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
8cd0: 72 6f 6d 20 70 6f 69 6e 74 20 74 6f 20 61 76 61  rom point to ava
8ce0: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
8cf0: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
8d00: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
8d10: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
8d20: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
8d30: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
8d40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8d50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
8d60: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
8d70: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
8d80: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
8d90: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
8da0: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
8db0: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
8dc0: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
8dd0: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
8de0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
8df0: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
8e00: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 53 70  tic void allocSp
8e10: 61 63 65 28 0a 20 20 63 68 61 72 20 2a 70 70 2c  ace(.  char *pp,
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8e30: 4e 2f 4f 55 54 3a 20 53 65 74 20 2a 70 70 20 74  N/OUT: Set *pp t
8e40: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6c 6c 6f 63  o point to alloc
8e50: 61 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 20  ated buffer */. 
8e60: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
8e70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8e80: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
8e90: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
8ea0: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
8eb0: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
8ec0: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
8ed0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8ef0: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
8f00: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
8f10: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
8f20: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
8f30: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
8f40: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
8f50: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
8f60: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
8f70: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
8f80: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
8f90: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
8fa0: 28 20 28 2a 28 76 6f 69 64 2a 2a 29 70 70 29 3d  ( (*(void**)pp)=
8fb0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
8fc0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
8fd0: 0a 20 20 20 20 69 66 28 20 26 28 2a 70 70 46 72  .    if( &(*ppFr
8fe0: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
8ff0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 28 76 6f  nd ){.      *(vo
9000: 69 64 2a 2a 29 70 70 20 3d 20 28 76 6f 69 64 20  id**)pp = (void 
9010: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 20  *)*ppFrom;.     
9020: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
9030: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
9040: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
9050: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
9060: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9070: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
9080: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
9090: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
90a0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
90b0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
90c0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
90d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
90e0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
90f0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9100: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9110: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9120: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9130: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9140: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9150: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9160: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9170: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9180: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9190: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
91a0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
91b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
91c0: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
91d0: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
91e0: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
91f0: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9200: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9210: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9220: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9230: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9240: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9250: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9260: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9270: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9280: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9290: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
92a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
92b0: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
92c0: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
92d0: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
92e0: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
92f0: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9300: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9310: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9320: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9330: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9340: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9350: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9360: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9370: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9380: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
9390: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
93a0: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
93b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
93c0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
93d0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
93e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
93f0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
9400: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
9410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9420: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
9430: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
9440: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
9450: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
9460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9470: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
9480: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
9490: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
94c0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
94d0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
94e0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
94f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
9500: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
9510: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
9520: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
9530: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
9540: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9550: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
9560: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
9570: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
9580: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
9590: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
95a0: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
95b0: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
95c0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
95d0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
95e0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
95f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9600: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9610: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
9620: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
9630: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
9640: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9650: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
9660: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
9670: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
9680: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
9690: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
96a0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
96b0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
96c0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
96d0: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
96e0: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
96f0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
9700: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
9710: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
9720: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
9730: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
9740: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
9750: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
9760: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
9770: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
9780: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
9790: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
97a0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
97b0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
97c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
97d0: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
97e0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
97f0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
9800: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
9810: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
9820: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
9830: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
9840: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
9850: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
9860: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
9870: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
9880: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
9890: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
98a0: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
98b0: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
98c0: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
98d0: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
98e0: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
98f0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
9900: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
9910: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
9920: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
9930: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
9940: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
9950: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
9960: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
9970: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
9980: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
9990: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
99a0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
99b0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
99c0: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
99d0: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
99e0: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
99f0: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
9a00: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
9a10: 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75     u8 *zEnd = (u
9a20: 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  8 *)&p->aOp[p->n
9a30: 4f 70 41 6c 6c 6f 63 5d 3b 0a 20 20 20 20 69 6e  OpAlloc];.    in
9a40: 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 72 65 73  t nByte;.    res
9a50: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
9a60: 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e 75  &nArg);.    p->u
9a70: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
9a80: 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f 75   (u8)usesStmtJou
9a90: 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69 73  rnal;.    if( is
9aa0: 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  Explain && nMem<
9ab0: 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d  10 ){.      nMem
9ac0: 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   = 10;.    }.   
9ad0: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
9ae0: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20   zEnd-zCsr);.   
9af0: 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d   zCsr += (zCsr -
9b00: 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20 20   (u8*)0)&7;.    
9b10: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
9b20: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
9b30: 72 29 20 29 3b 0a 0a 20 20 20 20 64 6f 20 7b 0a  r) );..    do {.
9b40: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b        nByte = 0;
9b50: 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63  .      allocSpac
9b60: 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 4d 65  e((char*)&p->aMe
9b70: 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
9b80: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
9b90: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
9ba0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
9bb0: 72 2a 29 26 70 2d 3e 61 56 61 72 2c 20 6e 56 61  r*)&p->aVar, nVa
9bc0: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  r*sizeof(Mem), &
9bd0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
9be0: 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  te);.      alloc
9bf0: 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d  Space((char*)&p-
9c00: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
9c10: 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72  eof(Mem*), &zCsr
9c20: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
9c30: 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63  .      allocSpac
9c40: 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 7a 56  e((char*)&p->azV
9c50: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
9c60: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  char*), &zCsr, z
9c70: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
9c80: 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28      allocSpace((
9c90: 63 68 61 72 2a 29 26 70 2d 3e 61 70 43 73 72 2c  char*)&p->apCsr,
9ca0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9cb0: 20 20 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f     nCursor*sizeo
9cc0: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 20  f(VdbeCursor*), 
9cd0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
9ce0: 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
9cf0: 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
9d00: 20 20 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65          p->pFree
9d10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9d20: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
9d30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9d40: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
9d50: 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 26  ;.      zEnd = &
9d60: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 20  zCsr[nByte];.   
9d70: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
9d80: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
9d90: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e  led );..    p->n
9da0: 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43  Cursor = (u16)nC
9db0: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  ursor;.    if( p
9dc0: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->aVar ){.      
9dd0: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
9de0: 29 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f 72  )nVar;.      for
9df0: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
9e00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
9e10: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
9e20: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
9e30: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
9e40: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
9e50: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4d   }.    if( p->aM
9e60: 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  em ){.      p->a
9e70: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
9e90: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
9ea0: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20  1..nMem */.     
9eb0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
9ee0: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
9ef0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e        for(n=1; n
9f00: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
9f10: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
9f20: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
9f30: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d  l;.        p->aM
9f40: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
9f50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9f70: 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20  EBUG.  for(n=1; 
9f80: 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  n<p->nMem; n++){
9f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fa0: 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29  aMem[n].db==db )
9fb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9fc0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
9fd0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
9fe0: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
9ff0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
a000: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
a010: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
a020: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
a030: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
a040: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
a050: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
a060: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
a070: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
a080: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23  Statement = 0;.#
a090: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
a0a0: 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  LE.  {.    int i
a0b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a0c0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
a0d0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
a0e0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  nt = 0;.      p-
a0f0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
a100: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
a110: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
a120: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
a130: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
a140: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
a150: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
a160: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
a170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a180: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
a190: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
a1a0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
a1b0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
a1c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
a1d0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
a1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a1f0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
a200: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
a210: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
a220: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
a230: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
a240: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
a250: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
a260: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
a270: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
a280: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
a290: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
a2a0: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
a2b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
a2c0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
a2d0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  Cx->pVtabCursor 
a2e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
a2f0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
a300: 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70  bCursor = pCx->p
a310: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
a320: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
a330: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
a340: 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  pCx->pModule;.  
a350: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
a360: 64 20 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64  d = 1;.    (void
a370: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
a380: 66 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d  f(p->db);.    pM
a390: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
a3a0: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
a3b0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
a3c0: 65 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20  etyOn(p->db);.  
a3d0: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
a3e0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
a3f0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
a400: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
a410: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
a420: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
a430: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
a440: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
a450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
a460: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
a470: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
a480: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
a490: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
a4a0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
a4b0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
a4c0: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
a4d0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
a4e0: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
a4f0: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
a500: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
a510: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
a520: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
a530: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
a540: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
a550: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
a560: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
a570: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
a580: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
a590: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
a5a0: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
a5b0: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
a5c0: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
a5d0: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  >nChange;.  retu
a5e0: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
a5f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
a600: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
a610: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
a620: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
a630: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
a640: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
a650: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
a660: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
a670: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
a680: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
a690: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
a6a0: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
a6b0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
a6c0: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
a6d0: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
a6e0: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
a6f0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
a700: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
a710: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
a720: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
a730: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
a740: 65 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70  e *pFrame = p->p
a750: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
a760: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
a770: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
a780: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
a790: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
a7a0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
a7b0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
a7c0: 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20    }.  p->pFrame 
a7d0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65  = 0;.  p->nFrame
a7e0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
a7f0: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
a800: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
a810: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
a820: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
a830: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
a840: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
a850: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
a860: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
a870: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
a880: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
a890: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
a8a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
a8b0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
a8c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
a8d0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
a8e0: 4d 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Mem);.  }.}../*.
a8f0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
a900: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
a910: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
a920: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
a930: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
a940: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
a950: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
a960: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
a970: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
a980: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
a990: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
a9a0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
a9b0: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
a9c0: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
a9d0: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
a9e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
a9f0: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
aa00: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
aa10: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
aa20: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
aa30: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
aa40: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
aa50: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
aa60: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
aa70: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
aa80: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
aa90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
aaa0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
aab0: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
aac0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b  ==0 || p->apCsr[
aad0: 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  i]==0 );.  for(i
aae0: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
aaf0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
ab00: 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d  aMem==0 || p->aM
ab10: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
ab20: 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a  _Null );.#endif.
ab30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
ab40: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
ab50: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
ab60: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
ab70: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
ab80: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
ab90: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
aba0: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
abb0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
abc0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
abd0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
abe0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
abf0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
ac00: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
ac10: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
ac20: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
ac30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
ac40: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
ac50: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
ac60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
ac70: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
ac80: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
ac90: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
aca0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
acb0: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
acc0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
acd0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
ace0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
acf0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
ad00: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
ad10: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
ad20: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
ad30: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
ad40: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
ad50: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
ad60: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
ad70: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
ad80: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
ad90: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
ada0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
adb0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
adc0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
add0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
ade0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
adf0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
ae00: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
ae10: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
ae20: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
ae30: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
ae40: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
ae50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
ae60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
ae70: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
ae80: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
ae90: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
aea0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
aeb0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
aec0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
aed0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
aee0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
aef0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
af00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
af10: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
af20: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
af30: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
af40: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
af50: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
af60: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
af70: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
af80: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
af90: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
afa0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
afb0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
afc0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
afd0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
afe0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
aff0: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
b000: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b010: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
b020: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
b050: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
b060: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
b090: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
b0a0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
b0b0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b0d0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
b0e0: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
b0f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b100: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
b110: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
b120: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
b130: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
b140: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
b150: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
b160: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
b170: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
b180: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
b190: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
b1a0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
b1b0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
b1c0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
b1d0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
b1e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
b1f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b200: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
b210: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
b220: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
b230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b240: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
b250: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
b260: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
b270: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
b280: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
b290: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
b2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
b2b0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
b2c0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
b2d0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
b2e0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
b2f0: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
b300: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
b310: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
b320: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b330: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
b340: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
b350: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
b360: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
b370: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
b380: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
b390: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
b3a0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
b3b0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
b3c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
b3d0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
b3e0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
b3f0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
b400: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
b410: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b420: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
b430: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
b440: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
b450: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
b460: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
b470: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
b480: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
b490: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
b4a0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
b4b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
b4c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
b4d0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
b4e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b4f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b500: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
b510: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
b520: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
b530: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
b540: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
b550: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
b560: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
b570: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
b580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
b590: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
b5a0: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
b5b0: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
b5c0: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
b5d0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
b5e0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
b5f0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
b600: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
b610: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
b620: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
b630: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
b640: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
b650: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
b660: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
b670: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
b680: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
b690: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
b6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
b6b0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
b6c0: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
b6d0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  p->zErrMsg);.  i
b6e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b6f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
b700: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
b710: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
b720: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
b730: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
b740: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
b750: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
b760: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
b770: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
b780: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
b790: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
b7a0: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
b7b0: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
b7c0: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
b7d0: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
b7e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
b7f0: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
b800: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
b810: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
b820: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
b830: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
b840: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
b850: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
b860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
b870: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
b880: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
b890: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
b8a0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
b8b0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
b8c0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
b8d0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
b8e0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
b8f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b900: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
b910: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
b920: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
b930: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
b940: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
b950: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
b960: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
b970: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
b980: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
b990: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
b9a0: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
b9b0: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
b9c0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
b9d0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
b9e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
b9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
ba00: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
ba10: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
ba20: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
ba30: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
ba40: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
ba50: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
ba60: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
ba70: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
ba80: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
ba90: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
baa0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
bab0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
bac0: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
bad0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
bae0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
baf0: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
bb00: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
bb10: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
bb20: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
bb30: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
bb40: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
bb50: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
bb60: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
bb70: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
bb80: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
bb90: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
bba0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
bbb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
bbc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
bbd0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
bbe0: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
bbf0: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
bc00: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
bc10: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
bc20: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
bc30: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
bc40: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
bc50: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
bc60: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
bc70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
bc80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
bc90: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
bca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bcb0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
bcc0: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
bcd0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
bce0: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
bcf0: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
bd00: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
bd10: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
bd20: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
bd30: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
bd40: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
bd50: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
bd60: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
bd70: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
bd80: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
bd90: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
bda0: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
bdb0: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
bdc0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
bdd0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
bde0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
bdf0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
be00: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
be10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
be20: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
be30: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
be40: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
be50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
be60: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
be70: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
be80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
be90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
beb0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
bec0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
bed0: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
bee0: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
bef0: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
bf00: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
bf10: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
bf20: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
bf30: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
bf40: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
bf50: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
bf60: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
bf70: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
bf80: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
bf90: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
bfa0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
bfb0: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
bfc0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
bfd0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
bfe0: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
bff0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
c000: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
c010: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
c020: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
c030: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
c040: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
c050: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
c060: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
c070: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
c080: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
c090: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
c0a0: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
c0b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
c0c0: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
c0d0: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
c0e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c0f0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
c100: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
c110: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
c120: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
c130: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
c140: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
c150: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
c160: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69  X", zMainFile, i
c170: 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  Random&0x7ffffff
c180: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
c190: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
c1a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c1b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
c1c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c1d0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
c1e0: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
c1f0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
c200: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
c210: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c220: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
c230: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c240: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
c250: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c260: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
c270: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
c280: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
c290: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
c2a0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
c2b0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
c2c0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
c2d0: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
c2e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
c2f0: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
c300: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
c310: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
c320: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
c330: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c340: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c350: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
c360: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
c370: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
c380: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
c390: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
c3a0: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
c3b0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
c3c0: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
c3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
c3e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c3f0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
c400: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
c410: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
c420: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
c430: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
c440: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
c450: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
c460: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
c470: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c480: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
c490: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
c4a0: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
c4b0: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
c4c0: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
c4d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c4e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
c4f0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
c500: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
c510: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
c520: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
c530: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
c540: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
c550: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
c560: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
c570: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
c580: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 7c 7c 20 7a  f( zFile==0 || z
c590: 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  File[0]==0 ){.  
c5a0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
c5b0: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
c5c0: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
c5d0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
c5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c5f0: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
c600: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
c610: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
c620: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
c630: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
c640: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
c650: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
c660: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
c670: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c680: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
c690: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
c6a0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
c6b0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
c6c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c6d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
c6f0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
c700: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c710: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
c720: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
c730: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c740: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
c750: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
c760: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
c770: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c780: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
c790: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c7a0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
c7b0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
c7c0: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
c7d0: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
c7e0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
c7f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
c800: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
c810: 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
c820: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c830: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
c840: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
c850: 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
c860: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
c870: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
c880: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
c890: 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
c8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
c8b0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
c8c0: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
c8d0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
c8e0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
c8f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c900: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
c910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
c920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
c930: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
c940: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
c950: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c960: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
c970: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
c980: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
c990: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
c9a0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
c9b0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
c9c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
c9d0: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
c9e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c9f0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
ca00: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
ca10: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
ca20: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
ca30: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
ca40: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ca50: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
ca60: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
ca70: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
ca80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ca90: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
caa0: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
cab0: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
cac0: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
cad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cae0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
caf0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
cb00: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
cb10: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
cb20: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
cb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
cb40: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
cb50: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
cb60: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
cb70: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cb80: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cb90: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
cba0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cbb0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
cbc0: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
cbd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
cbe0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
cbf0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
cc00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cc10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
cc30: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
cc40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
cc50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
cc60: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
cc70: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
cc80: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
cc90: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
cca0: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
ccb0: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
ccc0: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
ccd0: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
cce0: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
ccf0: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
cd00: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
cd10: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
cd20: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
cd30: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
cd40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
cd50: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
cd60: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
cd70: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
cd80: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cd90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
cda0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
cdb0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
cdc0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
cdd0: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
cde0: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
cdf0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
ce00: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
ce10: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
ce20: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
ce30: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
ce40: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
ce50: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
ce60: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
ce70: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
ce80: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
ce90: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
cea0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
ceb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
cec0: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
ced0: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
cee0: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
cef0: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
cf00: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
cf10: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
cf20: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
cf30: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
cf40: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
cf50: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
cf60: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
cf70: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
cf80: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
cf90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
cfa0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
cfb0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
cfc0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
cfd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
cfe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cff0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d000: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
d010: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d020: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
d030: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
d040: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
d050: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
d060: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d070: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
d080: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
d090: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
d0a0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
d0b0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
d0c0: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
d0d0: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
d0e0: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
d0f0: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
d100: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
d110: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
d120: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
d130: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
d140: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
d150: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
d160: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
d170: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
d180: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
d190: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
d1a0: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
d1b0: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
d1c0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
d1d0: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
d1e0: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
d1f0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
d200: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
d210: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
d220: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
d230: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
d240: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
d250: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
d260: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
d270: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
d280: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
d290: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
d2a0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
d2b0: 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
d2c0: 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
d2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
d2e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
d2f0: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
d300: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
d310: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
d320: 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  te==db->writeVdb
d330: 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  eCnt );.}.#else.
d340: 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
d350: 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
d360: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ndif../*.** For 
d370: 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74  every Btree that
d380: 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e   in database con
d390: 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68  nection db which
d3a0: 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f   .** has been mo
d3b0: 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f  dified, "trip" o
d3c0: 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63  r invalidate eac
d3d0: 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74  h cursor in.** t
d3e0: 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20  hat Btree might 
d3f0: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
d400: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ed so that the c
d410: 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76  ursor.** can nev
d420: 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  er be used again
d430: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
d440: 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  when a rollback.
d450: 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20  *** occurs.  We 
d460: 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c  have to trip all
d470: 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f   the other curso
d480: 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73  rs, even.** curs
d490: 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d  or from other VM
d4a0: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64  s in different d
d4b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d4c0: 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ons,.** so that 
d4d0: 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79  none of them try
d4e0: 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61   to use the data
d4f0: 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a   at which they.*
d500: 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20  * were pointing 
d510: 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61  and which now ma
d520: 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e  y have been chan
d530: 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68  ged due.** to th
d540: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
d550: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20  * Remember that 
d560: 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64  a rollback can d
d570: 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d  elete tables com
d580: 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f  plete and.** reo
d590: 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20  rder rootpages. 
d5a0: 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   So it is not su
d5b0: 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f  fficient just to
d5c0: 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61   save.** the sta
d5d0: 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
d5e0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
d5f0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
d600: 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  sor.** so that i
d610: 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  t is never used 
d620: 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  again..*/.static
d630: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
d640: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
d650: 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20  dBtrees(sqlite3 
d660: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
d670: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
d680: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
d690: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
d6a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
d6b0: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74  ( p && sqlite3Bt
d6c0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
d6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d6e0: 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
d6f0: 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42  ors(p, SQLITE_AB
d700: 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ORT);.    }.  }.
d710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
d720: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
d730: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d740: 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
d750: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
d760: 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
d770: 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
d780: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
d790: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
d7a0: 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
d7b0: 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
d7c0: 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
d7d0: 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
d7e0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
d7f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
d800: 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
d810: 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
d820: 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
d830: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
d840: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
d850: 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  mtted..**.** If 
d860: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d870: 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
d880: 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
d890: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
d8a0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
d8b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
d8c0: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
d8d0: 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
d8e0: 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
d8f0: 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
d900: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
d910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d920: 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
d930: 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
d940: 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
d950: 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
d960: 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
d970: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
d980: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
d990: 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
d9a0: 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
d9b0: 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
d9c0: 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
d9d0: 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69  e occured, causi
d9e0: 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
d9f0: 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
da00: 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
da10: 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
da20: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
da30: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
da40: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
da50: 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
da60: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
da70: 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
da80: 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
da90: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
daa0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
dab0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
dac0: 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
dad0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
dae0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
daf0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
db00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
db10: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
db20: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
db30: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
db40: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
db50: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
db60: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
db70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
db80: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
db90: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
dba0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
dbb0: 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
dbc0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
dbd0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
dbe0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
dbf0: 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
dc00: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
dc10: 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
dc20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dc30: 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
dc40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dc50: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
dc60: 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
dc70: 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
dc80: 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
dc90: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
dca0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
dcb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dcc0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
dcd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dce0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
dcf0: 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
dd00: 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
dd10: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
dd20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
dd30: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
dd40: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
dd50: 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
dd60: 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
dd70: 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
dd80: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
dd90: 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
dda0: 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
ddb0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
ddc0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
ddd0: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
dde0: 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
ddf0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
de00: 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
de10: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
de20: 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
de30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
de40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
de50: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
de60: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
de70: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
de80: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
de90: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
dea0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
deb0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
dec0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
ded0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
dee0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
def0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
df00: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
df10: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
df20: 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65  oing so it.** se
df30: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
df40: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
df50: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
df60: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
df70: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
df80: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
df90: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
dfa0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
dfb0: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
dfc0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
dfd0: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
dfe0: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
dff0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
e000: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
e010: 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73  reeEnterAll() is
e020: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
e030: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
e040: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
e050: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
e060: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
e070: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
e080: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
e090: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
e0a0: 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75  h the VM. Of cou
e0b0: 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65  rse only a subse
e0c0: 74 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  t of these struc
e0d0: 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65  tures.** will be
e0e0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
e0f0: 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c   VM, and we coul
e100: 64 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65  d use Vdbe.btree
e110: 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a  Mask to figure.*
e120: 2a 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75  * that subset ou
e130: 74 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  t, but there is 
e140: 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  no advantage to 
e150: 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20  doing so..**.** 
e160: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
e170: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
e180: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
e190: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
e1a0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
e1b0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
e1c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e1d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e1e0: 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65  ACHE.void sqlite
e1f0: 33 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45  3VdbeMutexArrayE
e200: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23  nter(Vdbe *p){.#
e210: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
e220: 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74  SAFE.  sqlite3Bt
e230: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
e240: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
e250: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42  #else.  sqlite3B
e260: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e  treeEnterAll(p->
e270: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  db);.#endif.}.#e
e280: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
e290: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
e2a0: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
e2b0: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
e2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
e2d0: 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
e2e0: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
e2f0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
e300: 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
e310: 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
e320: 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
e330: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
e340: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
e350: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
e360: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
e370: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
e380: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
e390: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
e3a0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
e3b0: 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
e3c0: 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
e3d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
e3e0: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
e3f0: 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
e400: 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
e410: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
e420: 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72  d write.** an er
e430: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
e440: 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
e450: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
e460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e470: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
e480: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
e490: 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
e4a0: 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
e4b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e4c0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
e4d0: 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65  erred && db->nDe
e4e0: 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c  ferredCons>0) ||
e4f0: 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
e500: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
e510: 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  0) ){.    p->rc 
e520: 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
e530: 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  INT;.    p->erro
e540: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
e550: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
e560: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
e570: 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69  rMsg, db, "forei
e580: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
e590: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
e5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
e5b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
e5c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
e5d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
e5e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e5f0: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
e600: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
e610: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
e620: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
e630: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
e640: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
e650: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
e660: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
e670: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
e680: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
e690: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
e6a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e6b0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
e6c0: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
e6d0: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
e6e0: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
e6f0: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
e700: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
e710: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
e720: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
e730: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
e740: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
e750: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
e760: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
e770: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
e780: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
e790: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
e7a0: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
e7b0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
e7c0: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
e7d0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
e7e0: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
e7f0: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
e800: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
e810: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
e820: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
e830: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
e840: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
e870: 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
e880: 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
e890: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e8a0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
e8b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
e8c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
e8d0: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
e8e0: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
e8f0: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
e900: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
e910: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
e920: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
e930: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
e940: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
e950: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
e960: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
e970: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
e980: 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
e990: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
e9a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
e9b0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
e9c0: 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
e9d0: 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
e9e0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
e9f0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
ea00: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
ea10: 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
ea20: 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
ea30: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
ea40: 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
ea50: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
ea60: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ea70: 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
ea80: 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
ea90: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
eaa0: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
eab0: 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
eac0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
ead0: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
eae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eaf0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
eb00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
eb10: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
eb20: 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
eb30: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
eb40: 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
eb60: 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
eb70: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
eb80: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
eb90: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
eba0: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
ebb0: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
ebc0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
ebd0: 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
ebe0: 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
ebf0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
ec00: 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
ec10: 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
ec20: 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
ec30: 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
ec40: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
ec50: 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
ec60: 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
ec70: 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
ec80: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
ec90: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
eca0: 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72  lite3VdbeMutexAr
ecb0: 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  rayEnter(p);..  
ecc0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
ecd0: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
ece0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
ecf0: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
ed00: 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
ed10: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
ed20: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
ed30: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
ed40: 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
ed50: 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
ed60: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
ed70: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
ed80: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
edb0: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
edc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
edd0: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
ede0: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
edf0: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
ee00: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20   was read-only, 
ee10: 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f  we need do no ro
ee20: 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f  llback at all. O
ee30: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
ee40: 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  ** proceed with 
ee50: 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  the special hand
ee60: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ling..      */. 
ee70: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
ee80: 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
ee90: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
eea0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
eeb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
eec0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
eed0: 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
eee0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
eef0: 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
ef00: 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
ef10: 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
ef20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef30: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
ef40: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
ef50: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
ef60: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
ef70: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
ef80: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
ef90: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
efa0: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
efb0: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
efc0: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
efd0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
efe0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
eff0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
f000: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
f010: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
f020: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
f030: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
f040: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
f050: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
f060: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
f070: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f080: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
f090: 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
f0a0: 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
f0b0: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
f0c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
f0d0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
f0e0: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
f0f0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
f100: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
f110: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
f120: 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
f130: 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
f140: 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
f150: 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
f160: 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
f170: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
f180: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
f190: 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
f1a0: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
f1b0: 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
f1c0: 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
f1d0: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
f1e0: 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
f1f0: 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
f200: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
f210: 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
f220: 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
f230: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
f240: 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69  .     && db->wri
f250: 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72  teVdbeCnt==(p->r
f260: 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
f270: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
f280: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
f290: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
f2a0: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
f2b0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
f2c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
f2d0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
f2e0: 28 70 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  (p, 1) ){.      
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f300: 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
f310: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20  &p->aMutex);.   
f320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f330: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
f340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
f350: 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
f360: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
f370: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
f380: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
f390: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
f3a0: 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
f3b0: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
f3c0: 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
f3d0: 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
f3e0: 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
f3f0: 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
f400: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
f410: 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
f420: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
f430: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
f440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
f450: 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
f460: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
f470: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
f480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f490: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
f4a0: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
f4b0: 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tex);.          
f4c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f4d0: 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
f4e0: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
f4f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f500: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
f510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
f520: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
f530: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f540: 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
f550: 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
f560: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f570: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
f580: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
f590: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f5a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f5b0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
f5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f5d0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
f5e0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
f5f0: 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
f600: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
f610: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
f620: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
f630: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
f640: 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
f650: 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
f660: 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
f670: 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
f680: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
f690: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
f6a0: 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
f6b0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
f6c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f6d0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
f6e0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
f6f0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
f700: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
f710: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
f720: 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
f730: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
f740: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
f750: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
f760: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f770: 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
f780: 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
f790: 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
f7a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
f7b0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
f7c0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
f7d0: 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
f7e0: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
f7f0: 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
f800: 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
f810: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
f820: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
f830: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
f840: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
f850: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
f860: 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
f870: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
f880: 68 65 6e 20 73 65 74 20 74 68 65 20 65 72 72 6f  hen set the erro
f890: 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f  r.    ** code to
f8a0: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a   the new value..
f8b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
f8c0: 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
f8d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f8e0: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
f8f0: 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
f900: 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
f910: 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51  rc && (p->rc==SQ
f920: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
f930: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
f940: 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  INT) ){.        
f950: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
f960: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f970: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
f980: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  );.        p->zE
f990: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
f9a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f9b0: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
f9c0: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
f9d0: 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
f9e0: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
f9f0: 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
fa00: 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
fa10: 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
fa20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fa30: 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
fa40: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
fa50: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
fa60: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
fa70: 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
fa80: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
fa90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
faa0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
fab0: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
fac0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fae0: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
faf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fb00: 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
fb10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
fb20: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20   /* Rollback or 
fb30: 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d  commit any schem
fb40: 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f  a changes that o
fb50: 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20  ccurred. */.    
fb60: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
fb70: 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67  E_OK && db->flag
fb80: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
fb90: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20  hanges ){.      
fba0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
fbb0: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
fbc0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
fbd0: 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  gs = (db->flags 
fbe0: 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  | SQLITE_InternC
fbf0: 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a  hanges);.    }..
fc00: 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
fc10: 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
fc20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
fc30: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
fc40: 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  aMutex);.  }..  
fc50: 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
fc60: 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
fc70: 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
fc80: 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
fc90: 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
fca0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
fcb0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
fcc0: 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
fcd0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
fce0: 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
fcf0: 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t--;.    }.    a
fd00: 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76  ssert( db->activ
fd10: 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72  eVdbeCnt>=db->wr
fd20: 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20  iteVdbeCnt );.  
fd30: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
fd40: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
fd50: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
fd60: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
fd70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
fd80: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
fd90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fda0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
fdb0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
fdc0: 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
fdd0: 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
fde0: 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
fdf0: 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
fe00: 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
fe10: 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
fe20: 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
fe30: 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
fe40: 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
fe50: 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
fe60: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
fe70: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
fe80: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
fe90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
fea0: 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
feb0: 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
fec0: 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
fed0: 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e  dbeCnt>0 || db->
fee0: 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
fef0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
ff00: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
ff10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
ff20: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
ff30: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
ff40: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
ff50: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
ff60: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
ff70: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
ff80: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
ff90: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
ffa0: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
ffb0: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
ffc0: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
ffd0: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
ffe0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fff0: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
10000 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
10010 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
10020 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
10030 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
10040 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
10050 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
10060 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
10070 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
10080 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
10090 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
100a0 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
100b0 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
100c0 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
100d0 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
100e0 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
100f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
10100 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
10110 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
10120 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
10130 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
10140 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
10150 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
10160 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
10170 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
10180 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
10190 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
101a0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
101b0 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
101c0 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
101d0 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
101e0 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
101f0 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
10200 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
10210 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
10220 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
10230 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
10240 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
10250 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
10260 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
10270 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
10280 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
10290 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
102a0 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
102b0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
102c0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
102d0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
102e0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
102f0 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
10300 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
10310 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
10320 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
10330 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
10340 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
10350 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
10360 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
10370 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
10380 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
10390 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
103a0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
103b0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
103c0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
103d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
103e0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
103f0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
10400 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
10410 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
10420 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31  tStr(db->pErr,-1
10430 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49  ,p->zErrMsg,SQLI
10440 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
10450 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
10460 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
10470 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
10480 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
10490 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->rc;.      sqli
104a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
104b0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
104c0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
104d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
104e0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
104f0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
10500 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
10510 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10520 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
10530 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
10540 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
10550 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
10560 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
10570 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
10580 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
10590 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
105a0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
105b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
105c0 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
105d0 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
105e0 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
105f0 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
10600 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
10610 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
10620 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
10630 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
10640 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
10650 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
10660 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
10670 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
10680 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
10690 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
106a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
106b0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
106c0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
106d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
106e0 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
106f0 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
10700 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
10710 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
10720 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
10730 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
10740 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
10750 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
10760 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
10770 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
10780 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
10790 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
107a0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
107b0 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
107c0 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
107d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
107e0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
107f0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
10800 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
10810 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
10820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
10830 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
10840 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
10850 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
10860 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
10870 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
10880 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
10890 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
108a0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
108b0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
108c0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
108d0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
108e0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
108f0 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
10900 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
10910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10920 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
10930 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
10940 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
10950 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
10960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
10970 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
10980 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
10990 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
109a0 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
109b0 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
109c0 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
109d0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
109e0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
109f0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
10a00 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
10a10 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
10a20 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
10a30 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
10a40 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
10a50 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
10a60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10a70 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
10a80 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
10a90 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
10aa0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
10ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
10ac0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
10ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
10ae0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
10af0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
10b00 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10b10 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
10b20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
10b30 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
10b40 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
10b50 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
10b60 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
10b70 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
10b80 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
10b90 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
10ba0 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
10bb0 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
10bc0 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
10bd0 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
10be0 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
10bf0 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
10c00 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
10c10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10c20 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
10c30 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
10c40 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
10c50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
10c60 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
10c70 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
10c80 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
10c90 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
10ca0 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
10cb0 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
10cc0 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29  | !(mask&(((u32)
10cd0 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  1)<<i))) && pAux
10ce0 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
10cf0 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
10d00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
10d10 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
10d20 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
10d30 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
10d40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10d50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10d60 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
10d70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
10d80 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
10d90 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
10da0 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
10db0 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
10dc0 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
10dd0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
10de0 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
10df0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
10e10 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
10e20 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
10e30 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
10e40 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
10e50 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
10e60 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
10e70 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  rev;.  }.  relea
10e80 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
10e90 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
10ea0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
10eb0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
10ec0 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
10ed0 4d 45 5f 4e 29 3b 0a 20 20 76 64 62 65 46 72 65  ME_N);.  vdbeFre
10ee0 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
10ef0 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
10f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10f10 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
10f20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10f30 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
10f40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10f50 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
10f60 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
10f70 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71  MAGIC_DEAD;.  sq
10f80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10f90 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c  p->pFree);.  sql
10fa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10fb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
10fc0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
10fd0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
10fe0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
10ff0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
11000 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
11010 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
11020 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
11030 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
11040 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
11050 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
11060 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
11070 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
11080 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
11090 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
110a0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
110b0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
110c0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
110d0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
110e0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
110f0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
11100 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
11110 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
11120 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
11130 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
11140 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
11150 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
11160 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
11170 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
11180 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
11190 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
111a0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
111b0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
111c0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
111d0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
111e0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
111f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
11200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11210 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
11220 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
11230 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
11240 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
11250 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
11260 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
11270 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
11280 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
11290 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
112a0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
112b0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
112c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
112d0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
112e0 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
112f0 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
11300 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
11310 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
11320 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
11330 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
11340 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 70  etoTarget;.    p
11350 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
11360 20 41 4c 57 41 59 53 28 72 65 73 3d 3d 30 29 20   ALWAYS(res==0) 
11370 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 4e 45  ?1:0;.    if( NE
11380 56 45 52 28 72 65 73 3c 30 29 20 29 7b 0a 20 20  VER(res<0) ){.  
11390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
113a0 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75  BtreeNext(p->pCu
113b0 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
113c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
113d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66  rn rc;.    }.#if
113e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
113f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
11400 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
11410 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
11420 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
11430 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
11440 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
11450 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
11460 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
11470 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
11480 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
11490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
114a0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
114b0 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
114c0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
114d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
114e0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
114f0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
11500 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
11510 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
11520 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
11530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11540 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11550 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
11560 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
11570 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11580 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
11590 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
115a0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
115b0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
115c0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
115d0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
115e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
115f0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
11600 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
11610 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
11620 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
11630 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
11640 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
11650 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
11660 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
11670 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
11680 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
11690 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
116a0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
116b0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
116c0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
116d0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
116e0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
116f0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
11700 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
11710 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
11720 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
11730 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
11740 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
11750 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
11760 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
11770 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
11780 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
11790 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
117a0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
117b0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
117c0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
117d0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
117e0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
117f0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
11800 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
11810 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
11820 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
11830 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
11840 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
11850 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
11860 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
11870 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
11880 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
11890 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
118a0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
118b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
118c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
118d0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
118e0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
11910 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
11940 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
11950 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
11970 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
11980 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
11990 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
119a0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
119b0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
119c0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
119f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
11a00 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
11a10 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
11a20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
11a30 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
11a40 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
11a50 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
11a60 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
11a70 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
11aa0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
11ab0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
11ac0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
11ad0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
11ae0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
11b10 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
11b20 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
11b50 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
11b60 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
11b70 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
11b80 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
11b90 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
11ba0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
11bb0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
11bc0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
11bd0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
11be0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
11bf0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
11c00 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
11c10 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
11c20 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
11c30 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
11c40 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
11c50 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
11c60 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
11c70 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
11c80 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
11c90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
11ca0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
11cb0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
11cc0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
11cd0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
11ce0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
11cf0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
11d00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
11d10 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
11d20 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
11d30 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
11d40 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
11d50 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
11d60 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
11d70 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
11d80 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
11d90 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
11da0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
11db0 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
11dc0 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
11dd0 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
11de0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b  return 8+(u32)i;
11df0 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69  .    }.    u = i
11e00 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
11e10 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
11e20 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
11e30 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
11e40 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
11e50 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
11e60 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
11e70 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
11e80 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
11e90 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
11ea0 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
11eb0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
11ec0 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
11ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
11ee0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
11ef0 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
11f00 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
11f10 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
11f20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
11f30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
11f40 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
11f50 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
11f60 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ro;.  }.  assert
11f70 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
11f80 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
11f90 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
11fa0 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
11fb0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
11fc0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
11fd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
11fe0 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
11ff0 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
12000 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12010 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
12020 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
12030 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
12040 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
12050 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
12060 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
12070 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
12080 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
12090 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
120a0 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
120b0 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
120c0 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
120d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
120e0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
120f0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
12100 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
12110 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
12120 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
12130 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
12140 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
12150 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
12160 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
12170 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
12180 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
12190 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
121a0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
121b0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
121c0 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
121d0 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
121e0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
121f0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
12200 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
12210 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
12220 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
12230 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
12240 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
12250 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
12260 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
12270 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
12280 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
12290 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
122a0 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
122b0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
122c0 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
122d0 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
122e0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
122f0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
12300 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
12310 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
12320 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
12330 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
12340 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
12350 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
12360 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
12370 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
12380 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
12390 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
123a0 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
123b0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
123c0 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
123d0 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
123e0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
123f0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
12400 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
12410 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
12420 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
12430 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
12440 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
12450 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
12460 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
12470 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
12480 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
12490 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
124a0 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
124b0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
124c0 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
124d0 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
124e0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
124f0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
12500 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
12510 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
12520 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
12530 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
12540 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
12550 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
12560 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
12570 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
12580 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
12590 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
125a0 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
125b0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
125c0 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
125d0 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
125e0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
125f0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
12600 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
12610 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
12620 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
12630 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
12640 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
12650 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
12660 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
12670 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
12680 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
12690 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
126a0 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
126b0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
126c0 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
126d0 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
126e0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
126f0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
12700 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
12710 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
12720 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
12730 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
12740 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
12750 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
12760 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
12770 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
12780 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
12790 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
127a0 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
127b0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
127c0 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
127d0 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
127e0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
127f0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
12800 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
12810 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
12820 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
12830 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
12840 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
12850 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
12860 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
12870 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
12880 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12890 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
128a0 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
128b0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
128c0 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
128d0 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
128e0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
128f0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
12900 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
12910 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
12920 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12930 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
12940 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
12950 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
12960 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
12970 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
12980 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
12990 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
129a0 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
129b0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
129c0 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
129d0 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
129e0 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
129f0 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
12a00 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
12a10 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
12a20 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
12a30 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
12a40 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
12a50 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
12a60 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
12a70 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
12a80 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
12a90 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
12aa0 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
12ab0 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
12ac0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
12ad0 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
12ae0 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
12af0 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
12b00 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
12b10 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
12b20 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
12b30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
12b40 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
12b50 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
12b60 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
12b70 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
12b80 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
12b90 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
12ba0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
12bb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
12bc0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
12bd0 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
12be0 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
12bf0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
12c00 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
12c10 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
12c20 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
12c30 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
12c40 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
12c50 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
12c60 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
12c70 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  mat);.  u32 len;
12c80 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
12c90 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
12ca0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
12cb0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
12cc0 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
12cd0 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
12ce0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
12cf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12d00 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
12d10 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
12d20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
12d30 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
12d40 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
12d50 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
12d60 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
12d70 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
12d80 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
12d90 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
12da0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
12db0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
12dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
12dd0 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20  <=(u32)nBuf );. 
12de0 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
12df0 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
12e00 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
12e10 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
12e20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
12e30 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
12e40 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
12e50 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
12e60 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
12e70 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
12e80 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
12e90 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
12ea0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
12eb0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
12ec0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
12ed0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
12ee0 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pe) );.    asser
12ef0 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66  t( pMem->n<=nBuf
12f00 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
12f10 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
12f20 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
12f30 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  len);.    if( pM
12f40 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
12f50 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65  Zero ){.      le
12f60 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
12f70 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ro;.      assert
12f80 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20  ( nBuf>=0 );.   
12f90 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33     if( len > (u3
12fa0 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  2)nBuf ){.      
12fb0 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75    len = (u32)nBu
12fc0 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
12fd0 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
12fe0 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
12ff0 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
13000 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
13010 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
13020 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
13030 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
13040 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
13050 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
13060 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
13070 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
13080 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
13090 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
130a0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
130b0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
130c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
130d0 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  d..*/ .u32 sqlit
130e0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
130f0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
13100 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
13110 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
13120 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
13130 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
13140 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
13150 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
13160 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
13170 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
131a0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
131b0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
131c0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
131d0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
131e0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
131f0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
13200 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
13210 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
13220 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
13230 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
13240 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
13250 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
13260 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
13270 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13280 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
13290 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
132a0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
132b0 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
132c0 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
132d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
132e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
132f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
13300 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
13310 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
13320 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
13330 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
13340 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
13350 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
13360 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
13370 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
13380 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
13390 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
133a0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
133b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
133c0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
133d0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
133e0 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
133f0 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
13400 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
13410 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
13420 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
13430 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
13440 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
13450 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
13460 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
13470 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
13480 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
13490 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
134a0 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
134b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
134c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
134d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
134e0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
134f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
13500 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
13510 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
13520 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
13530 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
13540 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
13550 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
13560 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
13570 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
13580 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
13590 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
135a0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
135b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
135c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
135d0 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
135e0 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
135f0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
13600 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
13610 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
13620 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
13630 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
13640 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
13650 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
13660 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
13670 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
13680 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
13690 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
136a0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
136b0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
136c0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
136d0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
136e0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
136f0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
13700 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
13710 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
13720 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
13730 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
13740 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
13750 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
13760 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
13770 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
13780 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
13790 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
137a0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
137b0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
137c0 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
137d0 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
137e0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
137f0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
13800 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
13810 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
13820 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
13830 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
13840 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
13850 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
13860 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
13870 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
13880 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
13890 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
138a0 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
138b0 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
138c0 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
138d0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
138e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
138f0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
13900 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
13910 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
13920 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13930 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
13940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
13950 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
13960 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
13970 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
13980 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
13990 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
139a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
139b0 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
139c0 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
139d0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
139e0 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
139f0 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
13a00 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
13a10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
13a20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13a30 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
13a40 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
13a50 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
13a60 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
13a70 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
13a80 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
13a90 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
13aa0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
13ab0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
13ac0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33  ault: {.      u3
13ad0 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  2 len = (serial_
13ae0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
13af0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
13b00 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
13b10 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
13b20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
13b30 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
13b40 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
13b50 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
13b60 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
13b70 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
13b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b90 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13ba0 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
13bb0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
13bc0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
13bd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13be0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
13bf0 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
13c00 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
13c10 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
13c20 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  [], parse the.**
13c30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55   record into a U
13c40 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
13c50 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
13c60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
13c70 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e   that structure.
13c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
13c90 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68  ng function migh
13ca0 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63  t provide szSpac
13cb0 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  e bytes of memor
13cc0 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53  y.** space at pS
13cd0 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63  pace.  This spac
13ce0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
13cf0 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
13d00 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64  ed.** VDbeParsed
13d10 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
13d20 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   if it is large 
13d30 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69  enough.  If it i
13d40 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f  s.** not big eno
13d50 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62  ugh, space is ob
13d60 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13d70 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13d80 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
13d90 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
13da0 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61  d be closed by a
13db0 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
13dc0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
13dd0 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a  ackedRecord()..*
13de0 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  / .UnpackedRecor
13df0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65  d *sqlite3VdbeRe
13e00 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
13e10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
13e20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
13e30 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
13e40 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
13e50 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
13e60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
13e70 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
13e80 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
13e90 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
13ea0 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
13eb0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
13ec0 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
13ed0 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
13ee0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
13ef0 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63  o hold the objec
13f00 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  t */.  int szSpa
13f10 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ce            /*
13f20 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
13f30 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  ] in bytes */.){
13f40 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
13f50 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
13f60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13f70 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e  har *)pKey;.  Un
13f80 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
13f90 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65    /* The unpacke
13fa0 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65  d record that we
13fb0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a   will return */.
13fc0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
13fd0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
13fe0 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20  space needed to 
13ff0 68 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73  hold p, in bytes
14000 20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75   */.  int d;.  u
14010 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b  32 idx;.  u16 u;
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14030 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
14040 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
14050 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
14060 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20  em;.  int nOff; 
14070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
14080 72 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20  rease pSpace by 
14090 74 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62  this much to 8-b
140a0 79 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a  yte align it */.
140b0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20    .  /*.  ** We 
140c0 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
140d0 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
140e0 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
140f0 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
14100 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
14110 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
14120 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
14130 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
14140 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
14150 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
14160 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
14170 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
14180 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
14190 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
141a0 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
141b0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
141c0 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
141d0 70 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a  pSpace += nOff;.
141e0 20 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66    szSpace -= nOf
141f0 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
14200 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
14210 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
14220 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
14230 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
14240 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
14250 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ace ){.    p = s
14260 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
14270 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
14280 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
14290 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
142a0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
142b0 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
142c0 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45  EE | UNPACKED_NE
142d0 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65  ED_DESTROY;.  }e
142e0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
142f0 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53  packedRecord*)pS
14300 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  pace;.    p->fla
14310 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs = UNPACKED_NE
14320 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a  ED_DESTROY;.  }.
14330 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
14340 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
14350 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
14360 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
14370 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d  p->aMem = pMem =
14380 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
14390 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
143a0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
143b0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  )];.  assert( EI
143c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
143d0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
143e0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
143f0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
14400 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
14410 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
14420 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
14430 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
14440 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
14450 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
14460 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
14470 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
14480 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
14490 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
144a0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
144b0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
144c0 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d  o->db;.    pMem-
144d0 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  >flags = 0;.    
144e0 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pMem->zMalloc = 
144f0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
14500 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
14510 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
14520 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
14530 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75     pMem++;.    u
14540 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
14550 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
14560 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
14570 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20  ->nField = u;.  
14580 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b  return (void*)p;
14590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
145a0 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20  outine destroys 
145b0 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  a UnpackedRecord
145c0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
145d0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
145e0 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
145f0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
14600 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
14610 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73  Mem *pMem;..  as
14620 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
14630 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
14640 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   & UNPACKED_NEED
14650 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f  _DESTROY );.  fo
14660 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61  r(i=0, pMem=p->a
14670 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64  Mem; i<p->nField
14680 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
14690 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63      /* The unpac
146a0 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c  ked record is al
146b0 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64  ways constructed
146c0 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   by the.    ** s
146d0 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b  qlite3VdbeUnpack
146e0 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
146f0 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d  n above, which m
14700 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  akes all.    ** 
14710 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
14720 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e  s static.  And n
14730 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  one of the eleme
14740 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65  nts are.    ** e
14750 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c  ver transformed,
14760 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
14770 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64  er anything to d
14780 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  elete..    */.  
14790 20 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d    if( NEVER(pMem
147a0 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c  ->zMalloc) ) sql
147b0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
147c0 73 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  se(pMem);.  }.  
147d0 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55  if( p->flags & U
147e0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
147f0 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
14800 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e  DbFree(p->pKeyIn
14810 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  fo->db, p);.  }.
14820 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
14830 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
14840 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
14850 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
14860 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
14870 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
14880 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
14890 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
148a0 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
148b0 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
148c0 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
148d0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
148e0 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
148f0 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
14900 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
14910 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
14920 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
14930 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
14940 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
14950 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
14960 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
14970 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
14980 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
14990 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
149a0 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
149b0 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
149c0 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
149d0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
149e0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
149f0 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20  lds..** The key 
14a00 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64  with fewer field
14a10 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d  s is usually com
14a20 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20  pares less than 
14a30 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b  the .** longer k
14a40 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20  ey.  However if 
14a50 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
14a60 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50  RKEY flags in pP
14a70 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61  Key2 is set.** a
14a80 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
14a90 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c  efixes are equal
14aa0 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c  , then key1 is l
14ab0 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a  ess than key2..*
14ac0 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41  * Or if the UNPA
14ad0 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49  CKED_MATCH_PREFI
14ae0 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  X flag is set an
14af0 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61  d the prefixes a
14b00 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65  re.** equal, the
14b10 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63  n the keys are c
14b20 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
14b30 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65  equal and.** the
14b40 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68   parts beyond th
14b50 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
14b60 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  are ignored..**.
14b70 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  ** If the UNPACK
14b80 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
14b90 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
14ba0 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  n the last byte 
14bb0 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  of.** the header
14bc0 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e   of pKey1 is ign
14bd0 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ored.  It is ass
14be0 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20  umed that pKey1 
14bf0 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b  is.** an index k
14c00 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64  ey, and thus end
14c10 73 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76  s with a rowid v
14c20 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20  alue.  The last 
14c30 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68  byte.** of the h
14c40 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65  eader will there
14c50 66 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69  fore be the seri
14c60 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
14c70 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20  owid:.** one of 
14c80 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36  1, 2, 3, 4, 5, 6
14c90 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20  , 8, or 9 - the 
14ca0 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74  integer serial t
14cb0 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72  ypes..** The ser
14cc0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
14cd0 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c  final rowid will
14ce0 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e   always be a sin
14cf0 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20  gle byte..** By 
14d00 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61  ignoring this la
14d10 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
14d20 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20  eader, we force 
14d30 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  the comparison.*
14d40 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
14d50 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
14d60 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74   of key1..*/.int
14d70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
14d80 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
14d90 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
14da0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
14db0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
14dc0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
14dd0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
14de0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69  ht key */.){.  i
14df0 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  nt d1;          
14e00 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
14e10 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
14e20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
14e30 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
14e40 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
14e50 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
14e60 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
14e70 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
14e80 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
14e90 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
14ea0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
14eb0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
14ec0 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
14ed0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
14ee0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
14ef0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
14f00 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
14f10 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
14f20 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
14f30 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
14f40 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
14f50 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
14f60 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
14f70 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
14f80 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
14f90 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
14fa0 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
14fb0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
14fc0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
14fd0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
14fe0 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  1.zMalloc = 0; )
14ff0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
15000 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
15010 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
15020 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
15030 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
15040 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
15050 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
15060 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
15070 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
15080 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
15090 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
150a0 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
150b0 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
150c0 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
150d0 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
150e0 65 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ed initialized, 
150f0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
15100 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
15110 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
15120 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
15130 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
15140 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
15150 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
15160 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
15170 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
15180 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
15190 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
151a0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
151b0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
151c0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
151d0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
151e0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
151f0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
15200 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
15210 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
15220 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
15230 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
15240 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
15250 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
15260 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
15270 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
15280 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NORE_ROWID ){.  
15290 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a    szHdr1--;.  }.
152a0 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
152b0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
152c0 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
152d0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
152e0 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
152f0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
15300 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
15310 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
15320 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
15330 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
15340 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
15350 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
15360 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
15370 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
15380 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
15390 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
153a0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
153b0 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  1)>0 ) break;.. 
153c0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
153d0 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
153e0 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
153f0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
15400 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
15410 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
15420 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
15430 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
15440 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
15450 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
15460 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
15470 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
15480 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
154b0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
154c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
154d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
154e0 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
154f0 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
15500 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
15510 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74  .      /* Invert
15520 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77   the result if w
15530 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43  e are using DESC
15540 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
15550 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
15560 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
15570 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b  & i<nField && pK
15580 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
15590 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
155a0 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
155b0 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a   }.    .      /*
155c0 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53   If the PREFIX_S
155d0 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65  EARCH flag is se
155e0 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73  t and all fields
155f0 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61   except the fina
15600 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64  l.      ** rowid
15610 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61   field were equa
15620 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68  l, then clear th
15630 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
15640 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20  flag and set .  
15650 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72      ** pPKey2->r
15660 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75  owid to the valu
15670 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66  e of the rowid f
15680 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20  ield in (pKey1, 
15690 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a  nKey1)..      **
156a0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
156b0 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
156c0 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a   opcode..      *
156d0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b  /.      if( (pPK
156e0 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
156f0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41  ACKED_PREFIX_SEA
15700 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65  RCH) && i==(pPKe
15710 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b  y2->nField-1) ){
15720 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15730 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26   idx1==szHdr1 &&
15740 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61   rc );.        a
15750 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67  ssert( mem1.flag
15760 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
15770 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66         pPKey2->f
15780 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45  lags &= ~UNPACKE
15790 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b  D_PREFIX_SEARCH;
157a0 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d  .        pPKey2-
157b0 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e  >rowid = mem1.u.
157c0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a  i;.      }.    .
157d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
157e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
157f0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d    }..  /* No mem
15800 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
15810 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
15820 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
15830 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
15840 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
15850 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
15860 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
15870 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
15880 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
15890 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
158a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
158b0 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
158c0 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
158d0 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  .zMalloc==0 );..
158e0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
158f0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
15900 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
15910 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
15920 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
15930 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
15940 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
15950 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  . If the UNPACKE
15960 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66  D_INCRKEY.  ** f
15970 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
15980 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62   break the tie b
15990 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20  y treating key2 
159a0 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20  as larger..  ** 
159b0 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50  If the UPACKED_P
159c0 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67  REFIX_MATCH flag
159d0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65   is set, then ke
159e0 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70  ys with common p
159f0 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65  refixes.  ** are
15a00 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
15a10 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77  e equal.  Otherw
15a20 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20  ise, the longer 
15a30 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a  key is the .  **
15a40 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20   larger.  As it 
15a50 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b  happens, the pPK
15a60 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ey2 will always 
15a70 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20  be the longer.  
15a80 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
15a90 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
15aa0 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
15ab0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79  0 );.  if( pPKey
15ac0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
15ad0 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20  KED_INCRKEY ){. 
15ae0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65     rc = -1;.  }e
15af0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
15b00 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
15b10 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b  _PREFIX_MATCH ){
15b20 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63  .    /* Leave rc
15b30 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ==0 */.  }else i
15b40 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29  f( idx1<szHdr1 )
15b50 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
15b60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15b70 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  . ../*.** pCur p
15b80 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
15b90 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
15ba0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
15bb0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
15bc0 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
15bd0 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
15be0 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
15bf0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
15c00 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
15c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
15c20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
15c30 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
15c40 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
15c50 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
15c60 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
15c70 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
15c80 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
15c90 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
15ca0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
15cb0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
15cc0 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
15cd0 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
15ce0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
15cf0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
15d00 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
15d10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
15d20 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
15d30 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
15d40 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
15d50 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
15d60 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
15d70 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
15d80 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
15d90 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
15da0 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
15db0 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
15dc0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
15dd0 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
15de0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
15df0 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ETER(db);..  /* 
15e00 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
15e10 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
15e20 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
15e30 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
15e40 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
15e50 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
15e60 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
15e70 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
15e80 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
15e90 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
15ea0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
15eb0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15ec0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
15ed0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
15ee0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
15ef0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
15f00 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
15f10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
15f20 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
15f30 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
15f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15f50 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
15f60 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
15f70 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
15f80 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
15f90 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
15fa0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
15fb0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
15fc0 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
15fd0 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
15fe0 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
15ff0 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
16000 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
16010 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
16020 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
16030 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
16040 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
16050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
16060 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
16070 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
16080 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
16090 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
160a0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
160b0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
160c0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
160d0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
160e0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
160f0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
16100 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
16110 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
16120 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
16130 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
16140 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
16150 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
16160 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
16170 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
16180 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
16190 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
161a0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
161b0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
161c0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
161d0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
161e0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
161f0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
16200 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
16210 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
16220 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
16230 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
16240 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
16250 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
16260 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
16270 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
16280 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
16290 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
162a0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
162b0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
162c0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
162d0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
162e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
162f0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
16300 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
16310 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
16320 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
16330 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
16340 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
16350 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
16360 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
16370 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
16380 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
16390 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
163a0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
163b0 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
163c0 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
163d0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
163e0 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
163f0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
16400 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
16410 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
16420 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
16430 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
16440 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
16450 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
16460 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16470 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
16480 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
16490 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
164a0 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
164b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
164c0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
164d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
164e0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
164f0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
16500 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
16510 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
16520 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
16530 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
16540 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
16550 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16560 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
16570 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
16580 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63  tcase( m.zMalloc
16590 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
165a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
165b0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
165c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
165d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
165e0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
165f0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
16600 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
16610 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
16620 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
16630 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
16640 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
16650 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
16660 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
16670 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
16680 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
16690 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
166a0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
166b0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
166c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
166d0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
166e0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
166f0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
16700 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
16710 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
16720 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
16730 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
16740 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
16750 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
16760 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
16770 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
16780 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
16790 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
167a0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
167b0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
167c0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
167d0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
167e0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
167f0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
16800 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
16810 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62  eyCompare(.  Vdb
16820 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
16830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16840 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
16850 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
16860 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
16870 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e  Unpacked,  /* Un
16880 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
16890 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  f key to compare
168a0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
168b0 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
168c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
168d0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
168e0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
168f0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
16900 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
16910 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
16920 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
16930 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
16940 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
16950 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
16960 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
16970 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
16980 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
16990 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
169a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
169b0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
169c0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
169d0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
169e0 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
169f0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
16a00 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
16a10 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
16a20 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20  use of the say. 
16a30 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
16a40 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
16a50 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
16a60 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
16a70 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
16a80 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
16a90 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
16aa0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
16ab0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
16ac0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
16ad0 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  }.  memset(&m, 0
16ae0 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
16af0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
16b00 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
16b10 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e  >pCursor, 0, (in
16b20 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
16b30 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
16b40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16b50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e   }.  assert( pUn
16b60 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20  packed->flags & 
16b70 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
16b80 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20  ROWID );.  *res 
16b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
16ba0 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
16bb0 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
16bc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
16bd0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
16be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16c00 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
16c10 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
16c20 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
16c30 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
16c40 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
16c50 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
16c60 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
16c70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
16c80 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
16c90 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
16ca0 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
16cb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16cc0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
16cd0 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
16ce0 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
16cf0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
16d00 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
16d10 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
16d20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
16d30 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
16d40 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
16d50 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
16d60 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
16d70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
16d80 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
16d90 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
16da0 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
16db0 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
16dc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
16dd0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
16de0 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
16df0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
16e00 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
16e10 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
16e20 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
16e30 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
16e40 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
16e50 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
16e60 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
16e70 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
16e80 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
16e90 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
16ea0 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
16eb0 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
16ec0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
16ed0 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
16ee0 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
16ef0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
16f00 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
16f10 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
16f20 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
16f30 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16f40 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
16f50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
16f60 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
16f70 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
16f80 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
16f90 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
16fa0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
16fb0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
16fc0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
16fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16fe0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
16ff0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
17000 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
17010 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
17020 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
17030 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
17040 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
17050 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
17060 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
17070 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
17080 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
17090 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
170a0 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
170b0 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
170c0 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
170d0 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
170e0 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
170f0 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
17100 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
17110 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
17120 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
17130 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
17140 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
17150 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
17160 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
17170 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
17180 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
17190 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
171a0 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
171b0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
171c0 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
171d0 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
171e0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
171f0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
17200 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
17210 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
17220 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
17230 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
17240 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
17250 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
17260 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
17270 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
17280 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
17290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172a0 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
172b0 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
172c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
172d0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
172e0 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
172f0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20  _UTF8);.        
17300 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
17310 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70  oreType((Mem *)p
17320 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
17330 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
17340 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17350 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17360 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
17370 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
17380 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
17390 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
173a0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
173b0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
173c0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
173d0 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
173e0 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
173f0 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
17400 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
17410 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
17420 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
17430 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
17440 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
17450 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
17460 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
17470 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
17480 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
17490 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
174a0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
174b0 7d 0a                                            }.