/ Hex Artifact Content
Login

Artifact eb13a6917ed7455b5b49236fe5cfb3d3c3e4c57b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61  also needs to ma
13a0: 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a  rk all btrees.**
13b0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
13c0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
13d0: 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75  zWhere string mu
13e0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
13f0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1400: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
1410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1420: 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70  l take ownership
1430: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
1440: 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69  d memory..*/.voi
1450: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  d sqlite3VdbeAdd
1460: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64  ParseSchemaOp(Vd
1470: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20  be *p, int iDb, 
1480: 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20  char *zWhere){. 
1490: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64   int j;.  int ad
14a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72  AddOp3(p, OP_Par
14c0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
14d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14e0: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
14f0: 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  ddr, zWhere, P4_
1500: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
1510: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
1520: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
1530: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
1540: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
1550: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1560: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1570: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
1580: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
15a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
15c0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
15d0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
15e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15f0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1600: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1620: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1630: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1640: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1650: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1660: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1670: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1680: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
16b0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
16c0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
16d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
16e0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
16f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1700: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1710: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
1720: 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33  PTR(p4), P4_INT3
1730: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  2);.  return add
1740: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1750: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1760: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1770: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1780: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1790: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
17a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
17b0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
17c0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
17d0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
17e0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
17f0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1800: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1810: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1820: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1830: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1840: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1850: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1860: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1870: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1880: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1890: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
18a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
18b0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
18c0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
18d0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
18e0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
18f0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1900: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1910: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1920: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1930: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1940: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1950: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1960: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1970: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1980: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1990: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
19a0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
19b0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
19c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
19d0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
19e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
19f0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1a00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a20: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
1a30: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
1a40: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e  .    int n = p->
1a50: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
1a60: 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  5;.    p->aLabel
1a70: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1a80: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
1a90: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61     n*sizeof(p->a
1ad0: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  Label[0]));.    
1ae0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1af0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b00: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Size(p->db, p->a
1b10: 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d  Label)/sizeof(p-
1b20: 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d  >aLabel[0]);.  }
1b30: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1b40: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1b50: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1b60: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1b70: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
1b80: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1b90: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1ba0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1bb0: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1bc0: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1bd0: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1be0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1bf0: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1c00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1c10: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1c20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c30: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1c50: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1c70: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1c80: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1c90: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1ca0: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1cb0: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1cc0: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1cd0: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1ce0: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
1cf0: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
1d00: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
1d10: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
1d20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
1d30: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
1d40: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
1d50: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65  ce = 1;.}..#ifde
1d60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f  f SQLITE_DEBUG /
1d70: 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  * sqlite3AssertM
1d80: 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20  ayAbort() logic 
1d90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
1da0: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64  llowing type and
1db0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73   function are us
1dc0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1dd0: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
1de0: 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d  s.** in a Vdbe m
1df0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20  ain program and 
1e00: 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d  each of the sub-
1e10: 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65  programs (trigge
1e20: 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69  rs) it may .** i
1e30: 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f  nvoke directly o
1e40: 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74  r indirectly. It
1e50: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1e60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e70: 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20  *   Op *pOp;.** 
1e80: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
1e90: 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73  er;.**.**   mems
1ea0: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
1eb0: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a  zeof(sIter));.**
1ec0: 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20     sIter.v = v; 
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20             // v 
1ef0: 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a  is of type Vdbe*
1f00: 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70   .**   while( (p
1f10: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
1f20: 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20  &sIter)) ){.**  
1f30: 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69     // Do somethi
1f40: 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20  ng with pOp.**  
1f50: 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44   }.**   sqlite3D
1f60: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
1f70: 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a  er.apSub);.** .*
1f80: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1f90: 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65   VdbeOpIter Vdbe
1fa0: 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56  OpIter;.struct V
1fb0: 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64  dbeOpIter {.  Vd
1fc0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
1fe0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1ff0: 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20  ugh the opcodes 
2000: 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  of */.  SubProgr
2010: 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20  am **apSub;     
2020: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
2030: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
2040: 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20  int nSub;       
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2060: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2070: 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e  in apSub */.  in
2080: 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20  t iAddr;        
2090: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
20a0: 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74  ess of next inst
20b0: 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  ruction to retur
20c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b  n */.  int iSub;
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72    /* 0 = main pr
20f0: 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74  ogram, 1 = first
2100: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63   sub-program etc
2110: 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f  . */.};.static O
2120: 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64  p *opIterNext(Vd
2130: 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20  beOpIter *p){.  
2140: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a  Vdbe *v = p->v;.
2150: 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a    Op *pRet = 0;.
2160: 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74    Op *aOp;.  int
2170: 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   nOp;..  if( p->
2180: 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b  iSub<=p->nSub ){
2190: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75  ..    if( p->iSu
21a0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f  b==0 ){.      aO
21b0: 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = v->aOp;.    
21c0: 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a    nOp = v->nOp;.
21d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e0: 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   aOp = p->apSub[
21f0: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b  p->iSub-1]->aOp;
2200: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e  .      nOp = p->
2210: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
2220: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
2230: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64   assert( p->iAdd
2240: 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52  r<nOp );..    pR
2250: 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64  et = &aOp[p->iAd
2260: 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64  dr];.    p->iAdd
2270: 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r++;.    if( p->
2280: 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20  iAddr==nOp ){.  
2290: 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20      p->iSub++;. 
22a0: 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20       p->iAddr = 
22b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
22c0: 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65  if( pRet->p4type
22d0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
22e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
22f0: 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29  te = (p->nSub+1)
2300: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
2310: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
2320: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
2330: 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b  ; j<p->nSub; j++
2340: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2350: 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74  ->apSub[j]==pRet
2360: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
2370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2380: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
2390: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
23a0: 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65  ->apSub = sqlite
23b0: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
23c0: 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62  (v->db, p->apSub
23d0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
23e0: 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20    if( !p->apSub 
23f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ){.          pRe
2400: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2420: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62  p->apSub[p->nSub
2430: 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70  ++] = pRet->p4.p
2440: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
2450: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2460: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2470: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Ret;.}../*.** Ch
2480: 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72  eck if the progr
2490: 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  am stored in the
24a0: 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77   VM associated w
24b0: 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a  ith pParse may.*
24c0: 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
24d0: 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73   exception (caus
24e0: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
24f0: 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72  t, but not entir
2500: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2510: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
2520: 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74  ck). This condit
2530: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
2540: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
2550: 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72  or any.** sub-pr
2560: 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20  ograms contains 
2570: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
2580: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  wing:.**.**   * 
2590: 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31   OP_Halt with P1
25a0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
25b0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
25c0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  rt..**   *  OP_H
25d0: 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50  altIfNull with P
25e0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
25f0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
2600: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
2610: 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20  Destroy.**   *  
2620: 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20  OP_VUpdate.**   
2630: 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a  *  OP_VRename.**
2640: 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74     *  OP_FkCount
2650: 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69  er with P2==0 (i
2660: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2670: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29   key constraint)
2680: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2690: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
26a0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
26b0: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
26c0: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
26d0: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
26e0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
26f0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2700: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2710: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2720: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2730: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2740: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2750: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2760: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2770: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2780: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2790: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
27a0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
27b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
27c0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
27d0: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
27e0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
27f0: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
2800: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
2810: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
2820: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
2830: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
2840: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
2850: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
2860: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
2870: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
2880: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2890: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
28a0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
28b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
28c0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
28d0: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
28e0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
28f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
2900: 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  me .#ifndef SQLI
2910: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
2920: 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63  KEY.     || (opc
2930: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
2940: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
2950: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a  && pOp->p2==1) .
2960: 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28  #endif.     || (
2970: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2980: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2990: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
29a0: 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53    && (pOp->p1==S
29b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
29c0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
29d0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
29e0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
29f0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2a10: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
2a20: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
2a30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
2a40: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
2a50: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
2a60: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2a70: 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ccured..  ** If 
2a80: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
2a90: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
2aa0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
2ab0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
2ac0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
2ad0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
2ae0: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
2af0: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
2b00: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
2b10: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
2b20: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
2b30: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
2b40: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
2b50: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
2b60: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
2b70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b80: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
2b90: 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64  yAbort );.}.#end
2ba0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2bb0: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
2bc0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2bd0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a   function */../*
2be0: 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  .** Loop through
2bf0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f   the program loo
2c00: 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75  king for P2 valu
2c10: 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61  es that are nega
2c20: 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20  tive.** on jump 
2c30: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45  instructions.  E
2c40: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
2c50: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
2c60: 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c  lve the.** label
2c70: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2c80: 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  P2 value to its 
2c90: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
2ca0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
2cb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2cc0: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
2cd0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
2ce0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
2cf0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
2d00: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
2d10: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
2d20: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
2d30: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
2d40: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
2d50: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
2d60: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
2d70: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
2d80: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
2d90: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
2da0: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
2db0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
2dc0: 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c  *.** The Op.opfl
2dd0: 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74  ags field is set
2de0: 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e   on all opcodes.
2df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e00: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
2e10: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
2e20: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
2e30: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
2e40: 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63  Args = *pMaxFunc
2e50: 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  Args;.  Op *pOp;
2e60: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
2e70: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d   p->aLabel;.  p-
2e80: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
2e90: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2ea0: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2eb0: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2ec0: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2ed0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2ee0: 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d    pOp->opflags =
2ef0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
2f00: 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a  operty[opcode];.
2f10: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2f20: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
2f30: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
2f40: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
2f50: 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20  Op->p5>nMaxArgs 
2f60: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2f70: 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p5;.    }else 
2f80: 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  if( (opcode==OP_
2f90: 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70  Transaction && p
2fa0: 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70  Op->p2!=0) || op
2fb0: 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20  code==OP_Vacuum 
2fc0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64  ){.      p->read
2fd0: 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Only = 0;.#ifnde
2fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2ff0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
3000: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
3010: 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20  =OP_VUpdate ){. 
3020: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
3030: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3040: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
3050: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
3060: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
3070: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
3080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3090: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
30a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30b0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
30c0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
30d0: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
30e0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
30f0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
3100: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
3110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
3120: 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code==OP_Next ||
3130: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74   opcode==OP_Sort
3140: 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  erNext ){.      
3150: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3160: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
3170: 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ext;.      pOp->
3180: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3190: 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NCE;.    }else i
31a0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 72  f( opcode==OP_Pr
31b0: 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  ev ){.      pOp-
31c0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
31d0: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
31e0: 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ous;.      pOp->
31f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3200: 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  NCE;.    }..    
3210: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
3220: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
3230: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
3240: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3250: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
3260: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
3270: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
3280: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
3290: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
32a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
32b0: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
32c0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
32d0: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
32e0: 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  axArgs;.}../*.**
32f0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
3300: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
3310: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
3320: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
3330: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
3340: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
3350: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
3360: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3370: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
3380: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
3390: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33a0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
33b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
33c0: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
33d0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
33e0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
33f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
3400: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
3410: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
3420: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
3430: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
3440: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
3450: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
3460: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
3470: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
3480: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
3490: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
34a0: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
34b0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
34c0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
34d0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
34e0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
34f0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
3500: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
3510: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
3520: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
3530: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3540: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
3550: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
3560: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
3570: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
3580: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
3590: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
35a0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
35b0: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
35c0: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
35d0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
35e0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
35f0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
3600: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
3610: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
3620: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3630: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
3640: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
3650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
3660: 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a  treeMask==0 );..
3670: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
3680: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
3690: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
36a0: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
36b0: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
36c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
36d0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
36e0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
36f0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
3700: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
3710: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
3720: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
3730: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3740: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
3750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
3760: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
3770: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
3780: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3790: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
37a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
37b0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
37c0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20   p->nOpAlloc && 
37d0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
37e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
37f0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
3800: 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  nOp;.  if( ALWAY
3810: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
3820: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
3830: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
3840: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
3850: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
3860: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
3870: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
3880: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
3890: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
38a0: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
38b0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
38c0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
38d0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
38e0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
38f0: 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70 63  0 && (sqlite3Opc
3900: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74  odeProperty[pOut
3910: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
3920: 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20  G_JUMP)!=0 ){.  
3930: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3940: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
3950: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3960: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3970: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
3980: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
3990: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
39a0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
39b0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
39c0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
39d0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
39e0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
39f0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
3a00: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
3a10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3a20: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
3a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a40: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
3a50: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
3a60: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
3a70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
3a80: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
3a90: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
3aa0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
3ab0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3ac0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
3ad0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3ae0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3af0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b00: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3b10: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3b20: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3b30: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3b40: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3b50: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3b60: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3b70: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3b80: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3b90: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
3ba0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
3bb0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3bc0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3bd0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3be0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3bf0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3c00: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
3c10: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3c20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
3c40: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c50: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3c60: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3c70: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
3c80: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
3c90: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
3ca0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3cb0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
3cc0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3cd0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3ce0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3cf0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3d00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3d10: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
3d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d40: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3d50: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3d60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3d70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3d80: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3d90: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
3da0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3db0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
3dc0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
3dd0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3de0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3e10: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3e20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3e30: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3e40: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3e50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3e60: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3e70: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3e80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3e90: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3ea0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3eb0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3ec0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3ed0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ee0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3ef0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3f00: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3f10: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f20: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3f30: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3f40: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3f60: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3f70: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3f80: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3f90: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3fa0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
3fb0: 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74 65  addr>=0 ) sqlite
3fc0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
3fd0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
3fe0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
3ff0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
4000: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
4010: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
4020: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
4030: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
4040: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
4050: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
4060: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
4070: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
4080: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
4090: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
40a0: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
40b0: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
40c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
40d0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
40e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
40f0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
4100: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
4110: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
4120: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
4130: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
4140: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
4150: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
4160: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
4170: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
4180: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
4190: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
41a0: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
41b0: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
41c0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
41d0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
41e0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
41f0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
4200: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
4210: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
4220: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
4230: 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20  RAY:.      case 
4240: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4250: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
4260: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4270: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4280: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4290: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
42a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F: {.        if(
42b0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
42c0: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
42d0: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20  ree(p4);.       
42e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
42f0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44        case P4_VD
4300: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
4310: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
4320: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
4330: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
4340: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
4350: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
4360: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
4370: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4380: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4390: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
43a0: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
43b0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
43c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
43d0: 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20   pVdbeFunc);.   
43e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
43f0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4400: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
4410: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
4420: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
4430: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4450: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4460: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
4470: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4480: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
44a0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
44b0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
44c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
44d0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
44e0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
44f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4500: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
4510: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4520: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4550: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4560: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
4570: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4580: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4590: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
45a0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
45b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
45c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
45d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
45e0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
45f0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
4600: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
4610: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
4620: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4630: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4640: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4650: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
4660: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
4670: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
4680: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4690: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
46a0: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
46b0: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
46c0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
46d0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
46e0: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
46f0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4700: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4710: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4720: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4730: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
4740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
4750: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
4760: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
4770: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4780: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
4790: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
47a0: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
47b0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
47c0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
47d0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
47e0: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
47f0: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
4800: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
4810: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
4820: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
4830: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
4840: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
4850: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
4860: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
4870: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
4880: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
4890: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
48a0: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
48b0: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
48c0: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
48d0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
48e0: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
48f0: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f  to OP_Noop.*/.vo
4900: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4910: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
4920: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4930: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4940: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4950: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4960: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4970: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
4980: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4990: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
49a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
49b0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
49c0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
49d0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
49e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
49f0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
4a00: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a10: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
4a20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4a30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4a40: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4a50: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4a60: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4a70: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4a80: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4a90: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4aa0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4ab0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4ac0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
4ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
4ae0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
4af0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
4b00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
4b10: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
4b20: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4b30: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4b40: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4b50: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4b60: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4b70: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4b80: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4b90: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4ba0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4bb0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4bc0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
4bd0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
4be0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
4bf0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
4c00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
4c10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4c20: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4c30: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4c40: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4c50: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4c60: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4c70: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4c80: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4c90: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4ca0: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4cb0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4cc0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4cd0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4ce0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4cf0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4d00: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4d10: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4d20: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4d30: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4d40: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4d50: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4d60: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4d70: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4d80: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4d90: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4da0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4db0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4dc0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4dd0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4de0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4df0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4e00: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4e10: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4e20: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4e30: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4e40: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4e50: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4e60: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4e70: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4e80: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4e90: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4ea0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4eb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4ec0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ed0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4ef0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4f00: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4f10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4f20: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4f40: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4f50: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4f60: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4f70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4f80: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4f90: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4fa0: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4fb0: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4fc0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4fd0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4fe0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ff0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5000: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
5010: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
5020: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
5030: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5040: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
5050: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
5060: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
5070: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
5080: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
5090: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
50a0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
50b0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
50c0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
50d0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
50e0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
50f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
5100: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
5110: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
5120: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
5130: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
5140: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
5150: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
5160: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
5170: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
5180: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
5190: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
51a0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
51b0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
51c0: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
51d0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
51e0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
51f0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
5200: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
5210: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
5220: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
5230: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
5240: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
5250: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
5260: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
5270: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
5280: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
5290: 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  Byte);.    pOp->
52a0: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
52b0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
52c0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
52d0: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
52e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
52f0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
5300: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
5310: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
5320: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5330: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5340: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
5350: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
5360: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5370: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
5380: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
5390: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
53a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
53b0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
53c0: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
53d0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
53e0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
53f0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5400: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5410: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5420: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5430: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5440: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5450: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
5460: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
5470: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
5480: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5490: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
54a0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
54b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
54c0: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
54d0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
54e0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
54f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
5500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
5510: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
5520: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5530: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5540: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
5550: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
5560: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5570: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5580: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5590: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
55a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
55b0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
55c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
55d0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
55e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
55f0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
5600: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
5610: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
5620: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5630: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5640: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
5650: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
5660: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
5670: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
5680: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
5690: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
56a0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
56b0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
56c0: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
56d0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
56e0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
56f0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
5700: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
5710: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
5720: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
5730: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
5740: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5750: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5760: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
5770: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5780: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5790: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
57a0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
57b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
57c0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
57d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
57e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
57f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5800: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
5810: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5820: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5830: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
5840: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5850: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
5860: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
5870: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
5880: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
5890: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
58a0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
58b0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
58c0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
58d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
58e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
58f0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
5900: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
5910: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5920: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
5930: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
5940: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
5950: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5960: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5970: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5980: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
5990: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
59a0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
59b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
59c0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
59d0: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
59e0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
59f0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
5a00: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
5a10: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
5a20: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
5a30: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
5a40: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
5a50: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
5a60: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
5a70: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
5a80: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
5a90: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
5aa0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
5ab0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
5ac0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
5ad0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
5ae0: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
5af0: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
5b00: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
5b10: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
5b20: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
5b30: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
5b40: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
5b50: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
5b60: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
5b70: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
5b80: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
5b90: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
5ba0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
5bb0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
5bc0: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
5bd0: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
5be0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
5bf0: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
5c00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
5c10: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
5c20: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
5c30: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
5c40: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
5c50: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
5c60: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
5c70: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
5c80: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
5c90: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
5ca0: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a  h Valgrind..**.*
5cb0: 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64  * About the #ifd
5cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
5cd0: 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c  RACE:  Normally,
5ce0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5cf0: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a   never called.**
5d00: 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30   unless p->nOp>0
5d10: 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
5d20: 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73  se in the absens
5d30: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
5d40: 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50  _TRACE,.** an OP
5d50: 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69  _Trace instructi
5d60: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73  on is always ins
5d70: 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  erted by sqlite3
5d80: 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f  VdbeGet() as soo
5d90: 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44  n as.** a new VD
5da0: 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  BE is created.  
5db0: 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74  So we are free t
5dc0: 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d  o set addr to p-
5dd0: 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a  >nOp-1 without.*
5de0: 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62  * having to doub
5df0: 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  le-check to make
5e00: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
5e10: 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67  esult is non-neg
5e20: 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66  ative. But.** if
5e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e40: 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  CE is defined, t
5e50: 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f  he OP_Trace is o
5e60: 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f  mitted and we do
5e70: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   need to.** chec
5e80: 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  k the value of p
5e90: 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63  ->nOp-1 before c
5ea0: 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64  ontinuing..*/.Vd
5eb0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
5ec0: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
5ed0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
5ee0: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
5ef0: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
5f00: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
5f10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5f20: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
5f30: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
5f40: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
5f50: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
5f60: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
5f70: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
5f80: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
5f90: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
5fa0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
5fb0: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
5fc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5fd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5fe0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5ff0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
6000: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
6010: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
6020: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6030: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
6040: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6050: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6060: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
6070: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
6080: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6090: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
60a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
60b0: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
60c0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
60d0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
60e0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
60f0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6100: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
6110: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
6120: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
6130: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
6140: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
6150: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6160: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
6170: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
6180: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
6190: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
61a0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
61b0: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
61c0: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
61d0: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
61e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
61f0: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
6200: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
6210: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
6220: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
6230: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
6240: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
6250: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
6260: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
6270: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
6280: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6290: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
62a0: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
62b0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
62c0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
62d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
62e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
62f0: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
6300: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
6310: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
6320: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6330: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
6340: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
6350: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
6360: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
6370: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
6380: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
6390: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
63a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
63b0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
63c0: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
63d0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
63e0: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
63f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
6400: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
6410: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
6420: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6440: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6450: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
6460: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
6470: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
6480: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
6490: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
64a0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
64b0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
64c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
64d0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
64e0: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
64f0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
6500: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6510: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
6520: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6530: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
6540: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
6550: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
6560: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6570: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6580: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
6590: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
65a0: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
65b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
65d0: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
65e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
65f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
6600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6610: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6620: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
6630: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
6640: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
6650: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6660: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6670: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
6680: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
6690: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
66a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
66b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
66c0: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
66d0: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
66e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
66f0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
6700: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
6710: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6720: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6730: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
6740: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6750: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6760: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
6770: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6780: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6790: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
67a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
67b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
67c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
67d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
67e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
67f0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
6800: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
6810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6820: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
6830: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
6840: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
6850: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
6860: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
6870: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
6880: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
6890: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
68a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
68b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
68c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
68d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
68e0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
68f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6900: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
6910: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
6920: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6930: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6940: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
6950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6960: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6970: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
6980: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6990: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69a0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
69b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
69c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
69d0: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
69e0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
69f0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
6a00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6a10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6a20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6a30: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
6a40: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
6a50: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6a60: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
6a70: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
6a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6a90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6aa0: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
6ab0: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
6ac0: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
6ad0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6ae0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6af0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
6b00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6b10: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
6b20: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
6b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b40: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
6b50: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
6b60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6b70: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
6b80: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
6b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6ba0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
6bb0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
6bc0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
6bd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6be0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
6bf0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
6c00: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
6c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6c20: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6c30: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6c50: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6c60: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6c70: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6c80: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6c90: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6ca0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6cb0: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6cc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6cd0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6ce0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6cf0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6d00: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6d10: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6d20: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
6d30: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
6d40: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
6d50: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
6d60: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
6d70: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
6d80: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
6d90: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
6da0: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
6db0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
6dc0: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
6dd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6de0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
6df0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
6e00: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
6e10: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
6e20: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
6e30: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
6e40: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
6e50: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
6e60: 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74  sk)*8 );.  p->bt
6e70: 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  reeMask |= ((yDb
6e80: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66  Mask)1)<<i;.  if
6e90: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
6ea0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
6eb0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
6ec0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b  ) ){.    p->lock
6ed0: 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
6ee0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a  k)1)<<i;.  }.}..
6ef0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6f00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
6f10: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
6f20: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
6f30: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6f40: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
6f50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
6f60: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
6f70: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
6f80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
6f90: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
6fa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
6fb0: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
6fc0: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
6fd0: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
6fe0: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
6ff0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
7000: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
7010: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
7020: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
7030: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
7040: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
7050: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
7060: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
7070: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
7080: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
7090: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
70a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
70b0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
70c0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
70d0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
70e0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
70f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7100: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
7110: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
7120: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
7130: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
7140: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
7150: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
7160: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7170: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
7180: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
7190: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
71a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
71b0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
71c0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
71d0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
71e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
71f0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
7200: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
7210: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
7220: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
7230: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
7240: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
7250: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
7260: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
7270: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7280: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
7290: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
72a0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
72b0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
72c0: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
72d0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
72e0: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
72f0: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
7300: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
7310: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
7320: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
7330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7340: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
7350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d  .  int i;.  yDbM
7360: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69  ask mask;.  sqli
7370: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
7380: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
7390: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   if( p->lockMask
73a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
73b0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
73c0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
73d0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
73e0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
73f0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
7400: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
7410: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
7420: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
7430: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f  && (mask & p->lo
7440: 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c  ckMask)!=0 && AL
7450: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
7460: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
7470: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
7480: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
7490: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
74a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
74b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
74c0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
74d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
74e0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
74f0: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
7500: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
7510: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
7520: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
7530: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7540: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
7550: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44  ){.  int i;.  yD
7560: 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71  bMask mask;.  sq
7570: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
7580: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
7590: 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61  .  if( p->lockMa
75a0: 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  sk==0 ) return; 
75b0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
75c0: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
75d0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
75e0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
75f0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
7600: 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b  , mask=1; i<nDb;
7610: 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61   i++, mask += ma
7620: 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  sk){.    if( i!=
7630: 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e  1 && (mask & p->
7640: 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20  lockMask)!=0 && 
7650: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
7660: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
7670: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
7680: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
7690: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
76a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
76b0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
76c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
76d0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
76e0: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
76f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7700: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
7710: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
7720: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
7730: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
7740: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
7750: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
7760: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
7770: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
7780: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
7790: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
77a0: 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25  d %4d %4d %-4s %
77b0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
77c0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
77d0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
77e0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
77f0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
7800: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
7810: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
7820: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
7830: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
7840: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
7850: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
7860: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
7870: 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p5,.#ifdef SQLIT
7880: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
7890: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f  p->zComment ? pO
78a0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22  p->zComment : ""
78b0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a  .#else.      "".
78c0: 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66  #endif.  );.  ff
78d0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
78e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
78f0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
7900: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
7910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7920: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
7930: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
7940: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
7950: 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20    Mem *pEnd;.   
7960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7970: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
7980: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
7990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
79a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
79b0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
79c0: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
79d0: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
79e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
79f0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
7a00: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  loc);.      }.  
7a10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7a20: 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  }.    for(pEnd=&
7a30: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7a40: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
7a50: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
7a60: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
7a70: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
7a80: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
7a90: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
7aa0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
7ab0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7ac0: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
7ad0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
7ae0: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
7af0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
7b00: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
7b10: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
7b20: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
7b30: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
7b40: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
7b50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7b60: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
7b70: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
7b80: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
7b90: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
7ba0: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
7bb0: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
7bc0: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
7bd0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
7be0: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
7bf0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
7c00: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
7c10: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
7c20: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
7c30: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
7c40: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
7c50: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
7c60: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
7c70: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
7c80: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
7c90: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
7ca0: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
7cb0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
7cc0: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
7cd0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
7ce0: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
7cf0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
7d00: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
7d10: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
7d20: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
7d30: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
7d40: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
7d50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
7d60: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
7d70: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
7d80: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
7d90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7da0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
7db0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7dc0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
7dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7de0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
7df0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
7e00: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
7e10: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
7e20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69  ags = MEM_Invali
7e30: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  d;.    }.    db-
7e40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7e50: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
7e60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
7e70: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
7e80: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7e90: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7ea0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7eb0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7ec0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7ed0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7ee0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7ef0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7f00: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7f10: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7f20: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
7f30: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
7f40: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
7f50: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
7f60: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
7f70: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
7f80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7f90: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7fa0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7fb0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7fc0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7fd0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7fe0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7ff0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
8000: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
8010: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8020: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
8030: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
8040: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
8050: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
8060: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
8070: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
8080: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
8090: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
80a0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
80b0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
80c0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
80d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
80e0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
80f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
8100: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
8110: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
8120: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
8130: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
8140: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
8150: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
8160: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
8170: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
8180: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
8190: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
81a0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
81b0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
81c0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
81d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
81e0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
81f0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
8200: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
8210: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
8220: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
8230: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
8240: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
8250: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
8260: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
8270: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
8280: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8290: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
82a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
82b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
82c0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
82d0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
8300: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
8310: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
8320: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8340: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
8350: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
8360: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
8370: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
8380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8390: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
83a0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
83b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
83c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
83d0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
83e0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
83f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8400: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
8410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8420: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8430: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
8440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8470: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8480: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
84a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
84b0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
84c0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
84d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
84e0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
84f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
8500: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
8510: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8520: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
8530: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
8540: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
8550: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
8560: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
8570: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
8580: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
8590: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
85a0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
85b0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
85c0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
85d0: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
85e0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
85f0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
8600: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
8610: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
8620: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
8630: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
8640: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
8650: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
8660: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
8670: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
8680: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8690: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
86a0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
86b0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
86c0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
86d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
86e0: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
86f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8700: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
8710: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
8720: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
8730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8740: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
8750: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
8760: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
8770: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
8780: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
8790: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
87a0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
87b0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
87c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
87d0: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
87e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
87f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8800: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
8810: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
8820: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
8830: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
8840: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
8850: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
8860: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
8870: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
8880: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
8890: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
88a0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
88b0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
88c0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
88d0: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
88e0: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
88f0: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
8900: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
8910: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
8920: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
8930: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
8940: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
8950: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
8960: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
8970: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
8980: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
8990: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
89a0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
89b0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
89c0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
89d0: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
89e0: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
89f0: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
8a00: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
8a10: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
8a20: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
8a30: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
8a40: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
8a50: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
8a60: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
8a70: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
8a80: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
8a90: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
8aa0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
8ab0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
8ac0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
8ad0: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
8ae0: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
8af0: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8b00: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8b10: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8b20: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8b30: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
8b40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8b50: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
8b60: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
8b70: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
8b80: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
8b90: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8ba0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8bb0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8bc0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8bd0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8be0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8bf0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8c00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8c10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8c20: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8c30: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
8c40: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
8c50: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
8c60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8c70: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
8c80: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
8c90: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8ca0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8cb0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8cc0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8cd0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8ce0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8cf0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8d00: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8d10: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8d20: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8d30: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
8d40: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
8d50: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
8d60: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
8d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8d80: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
8d90: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8da0: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8db0: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8dc0: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8dd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8de0: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8df0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8e00: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8e10: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8e20: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
8e40: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
8e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
8e60: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
8e70: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
8e80: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8e90: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8ea0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8eb0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8ec0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8ed0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8ee0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8f10: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8f20: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8f30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8f40: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
8f50: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
8f60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
8f70: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
8f80: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8f90: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8fa0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8fb0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8fc0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8fd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8fe0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8ff0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9000: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9010: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9020: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9030: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
9040: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
9050: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
9060: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
9070: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
9080: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
9090: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
90a0: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
90b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
90c0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
90d0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
90e0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
90f0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
9100: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
9110: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
9120: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
9130: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
9140: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
9150: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
9160: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
9170: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
9180: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
9190: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
91a0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
91b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
91c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
91d0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
91e0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
91f0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
9200: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
9210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
9220: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
9230: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
9240: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
9250: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
9260: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
9270: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
9280: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
9290: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
92a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
92b0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
92c0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
92d0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
92e0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
92f0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
9300: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
9310: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9320: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9330: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
9340: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
9350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
9370: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9380: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9390: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
93a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
93b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
93c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
93d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
9400: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9410: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9420: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9430: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9440: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9450: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
9480: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9490: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
94a0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
94b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
94c0: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
94d0: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
94e0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
94f0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
9500: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
9530: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9540: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
9550: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
9560: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
9570: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
9580: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
9590: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
95a0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
95b0: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
95c0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
95d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95e0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
95f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
9600: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
9610: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
9620: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9630: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9640: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
9650: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9660: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
9670: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
9680: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
9690: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
96a0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
96b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
96c0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
96d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
96e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
96f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
9700: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
9710: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
9720: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
9730: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
9740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9750: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
9760: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
9770: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
9780: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
9790: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
97a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
97b0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
97c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
97d0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
97e0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
97f0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
9800: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
9810: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
9820: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
9830: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
9840: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
9850: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
9860: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
9870: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
9880: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9890: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
98a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
98b0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
98c0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
98d0: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
98e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
98f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
9910: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
9920: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9930: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
9940: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
9950: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
9960: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
9970: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
9980: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
9990: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
99a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
99b0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
99c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
99d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
99e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
99f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9a00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
9a10: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
9a20: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
9a30: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
9a40: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
9a50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
9a60: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9a70: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9a80: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9a90: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9aa0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9ab0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9ac0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9ad0: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9ae0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  .z!=0 ){.    con
9af0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70  st char *z = pOp
9b00: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c  ->p4.z;.    whil
9b10: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
9b20: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
9b30: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
9b40: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  s]\n", z);.  }.}
9b50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
9b60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9b70: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
9b80: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9b90: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
9ba0: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
9bb0: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
9bc0: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
9bd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9be0: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
9bf0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
9c00: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
9c10: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
9c20: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
9c30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
9c40: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
9c50: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
9c60: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
9c70: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
9c80: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
9c90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
9ca0: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
9cb0: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
9cc0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9cd0: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
9ce0: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
9cf0: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
9d00: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
9d10: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
9d20: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
9d30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
9d40: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
9d50: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
9d60: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
9d70: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
9d80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9da0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
9db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9dc0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
9dd0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
9de0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
9df0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
9e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9e10: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
9e20: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
9e30: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
9e40: 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64  ace from a fixed
9e50: 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64   size buffer and
9e60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
9e70: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61  r to.** that spa
9e80: 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63  ce.  If insuffic
9e90: 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76  ient space is av
9ea0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
9eb0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
9ec0: 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69  pBuf parameter i
9ed0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
9ee0: 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  lue of a pointer
9ef0: 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72   which will.** r
9f00: 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d  eceive the new m
9f10: 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20  emory.  pBuf is 
9f20: 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20  normally NULL.  
9f30: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  If pBuf is not.*
9f40: 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  * NULL, it means
9f50: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61   that memory spa
9f60: 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ce has already b
9f70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
9f80: 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72  d that.** this r
9f90: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
9fa0: 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e  t allocate any n
9fb0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ew memory.  When
9fc0: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
9fd0: 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75  NULL simply retu
9fe0: 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61  rn pBuf.  Only a
9ff0: 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f  llocate new memo
a000: 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42  ry space when pB
a010: 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  uf.** is NULL..*
a020: 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68  *.** nByte is th
a030: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a040: 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65  s of space neede
a050: 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d  d..**.** *ppFrom
a060: 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c   points to avail
a070: 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70  able space and p
a080: 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  End points to th
a090: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
a0a0: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e  available space.
a0b0: 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20    When space is 
a0c0: 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72  allocated, *ppFr
a0d0: 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70  om is advanced p
a0e0: 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  ast.** the end o
a0f0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
a100: 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  space..**.** *pn
a110: 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65  Byte is a counte
a120: 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  r of the number 
a130: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
a140: 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c  e that have fail
a150: 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  ed.** to allocat
a160: 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
a170: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
a180: 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f  ce in *ppFrom to
a190: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
a1a0: 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e  request, then in
a1b0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
a1c0: 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  by the amount of
a1d0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f   the request..*/
a1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
a1f0: 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64  locSpace(.  void
a200: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
a210: 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e   /* Where return
a220: 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65   pointer will be
a230: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
a240: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
a250: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
a260: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
a270: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f   */.  u8 **ppFro
a280: 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  m,         /* IN
a290: 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66  /OUT: Allocate f
a2a0: 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20  rom *ppFrom */. 
a2b0: 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20   u8 *pEnd,      
a2c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a2d0: 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
a2e0: 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72  the end of *ppFr
a2f0: 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  om buffer */.  i
a300: 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20  nt *pnByte      
a310: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61      /* If alloca
a320: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d  tion cannot be m
a330: 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a  ade, increment *
a340: 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61  pnByte */.){.  a
a350: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
a360: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46  E_ALIGNMENT(*ppF
a370: 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42  rom) );.  if( pB
a380: 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66  uf ) return pBuf
a390: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
a3a0: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  D8(nByte);.  if(
a3b0: 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74   &(*ppFrom)[nByt
a3c0: 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20  e] <= pEnd ){.  
a3d0: 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29    pBuf = (void*)
a3e0: 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70  *ppFrom;.    *pp
a3f0: 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  From += nByte;. 
a400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42   }else{.    *pnB
a410: 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  yte += nByte;.  
a420: 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  }.  return pBuf;
a430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
a440: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
a450: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
a460: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
a470: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
a480: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a490: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
a4a0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
a4b0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
a4c0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
a4d0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
a4e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
a4f0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
a500: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
a510: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
a520: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
a530: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
a540: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
a550: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
a560: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
a570: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
a580: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
a590: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
a5a0: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
a5b0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
a5c0: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
a5d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
a5e0: 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=1; i<p->nMe
a5f0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
a600: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
a610: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
a620: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
a630: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
a640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
a650: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
a660: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67  _Abort;.  p->mag
a670: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
a680: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
a690: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
a6a0: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
a6b0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
a6c0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
a6d0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
a6e0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
a6f0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
a700: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
a710: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
a720: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
a730: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
a740: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
a750: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
a760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
a770: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
a780: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
a790: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
a7a0: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
a7b0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
a7c0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
a7d0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
a7e0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
a7f0: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
a800: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
a810: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
a820: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
a830: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
a840: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
a850: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
a860: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
a870: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a880: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
a890: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a8a0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
a8b0: 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61   exact once on a
a8c0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
a8d0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
a8e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a8f0: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
a900: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
a910: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
a920: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
a930: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a940: 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 20   called, futher 
a950: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
a960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
a970: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
a980: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
a990: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
a9a0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
a9b0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
a9c0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
a9d0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
a9e0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
a9f0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
aa00: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
aa10: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
aa20: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
aa30: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
aa40: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
aa50: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
aa60: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
aa70: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
aa80: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
aa90: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
aaa0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
aab0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
aac0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
aad0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
aae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
aaf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ab00: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
ab10: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ab30: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ab40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ab50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab60: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
ab70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ab80: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
abb0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
abc0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
abf0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
ac00: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
ac10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac30: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
ac40: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac70: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
ac80: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
ac90: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
acc0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
acd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ad00: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
ad10: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
ad20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ad30: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
ad40: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
ad50: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
ad80: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
ad90: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
ada0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
adb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
adc0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
add0: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
ade0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
adf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ae00: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
ae10: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
ae20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
ae30: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
ae40: 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  IT );.  db = p->
ae50: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
ae60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ae70: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
ae80: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
ae90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
aea0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
aeb0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
aec0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
aed0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d  axArg;.  nOnce =
aee0: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a   pParse->nOnce;.
aef0: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29    if( nOnce==0 )
af00: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45   nOnce = 1; /* E
af10: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f  nsure at least o
af20: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f  ne byte in p->aO
af30: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a  nceFlag[] */.  .
af40: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
af50: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
af60: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
af70: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
af80: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
af90: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
afa0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
afb0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
afc0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
afd0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
afe0: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
aff0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
b000: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
b010: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
b020: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
b030: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
b040: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
b050: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
b060: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
b070: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
b080: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
b090: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
b0a0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
b0b0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
b0c0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
b0d0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
b0e0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
b0f0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
b100: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
b110: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
b120: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
b130: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20   registers, SQL 
b140: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20  variables, VDBE 
b150: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a  cursors and .  *
b160: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * an array to ma
b170: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69  rshal SQL functi
b180: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e  on arguments in.
b190: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28  .  */.  zCsr = (
b1a0: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  u8*)&p->aOp[p->n
b1b0: 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  Op];       /* Me
b1c0: 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66  mory avaliable f
b1d0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
b1e0: 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26  .  zEnd = (u8*)&
b1f0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
b200: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
b210: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
b220: 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73  zCsr[] */..  res
b230: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
b240: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
b250: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
b260: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
b270: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
b280: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
b290: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
b2a0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
b2b0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
b2c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
b2d0: 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73  Csr, 0, zEnd-zCs
b2e0: 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a  r);.  zCsr += (z
b2f0: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
b300: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
b310: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
b320: 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78  zCsr) );.  p->ex
b330: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
b340: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
b350: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
b360: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
b370: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
b380: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
b390: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
b3a0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
b3b0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
b3c0: 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  e at the .  ** e
b3d0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
b3e0: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
b3f0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
b400: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
b410: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
b420: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
b430: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
b440: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
b450: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
b460: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
b470: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
b480: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
b490: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
b4a0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
b4b0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
b4c0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
b4d0: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
b4e0: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
b4f0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
b500: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
b510: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
b520: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
b530: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
b540: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
b550: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b560: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
b570: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  .    nByte = 0;.
b580: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
b590: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
b5a0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
b5b0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
b5c0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b5d0: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
b5e0: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
b5f0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
b600: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b610: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67  e);.    p->apArg
b620: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b630: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
b640: 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72  eof(Mem*), &zCsr
b650: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b660: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
b670: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a  allocSpace(p->az
b680: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
b690: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20  (char*), &zCsr, 
b6a0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b6b0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
b6c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
b6d0: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
b6e0: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
b710: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b720: 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
b730: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b740: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
b750: 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  e, &zCsr, zEnd, 
b760: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  &nByte);.    if(
b770: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
b780: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
b790: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
b7a0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
b7b0: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
b7c0: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
b7d0: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
b7e0: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
b7f0: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
b800: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
b810: 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72  rsor = (u16)nCur
b820: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
b830: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
b840: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
b850: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
b860: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
b870: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
b880: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
b890: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
b8a0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
b8b0: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
b8c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b8d0: 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20   p->azVar ){.   
b8e0: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
b8f0: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
b900: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
b910: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
b920: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
b930: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
b940: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
b950: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
b960: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
b970: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
b980: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
b990: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
b9a0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9c0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
b9d0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
b9e0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
ba10: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
ba20: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
ba30: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
ba40: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
ba50: 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b  s = MEM_Invalid;
ba60: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
ba70: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
ba80: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
ba90: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
baa0: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
bab0: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
bac0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
bad0: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
bae0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
baf0: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
bb00: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
bb10: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
bb20: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
bb30: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
bb40: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
bb50: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
bb60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
bb70: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
bb80: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
bb90: 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43  , pCx);.  if( pC
bba0: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
bbb0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
bbc0: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
bbd0: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
bbe0: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
bbf0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
bc00: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
bc10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
bc20: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
bc30: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
bc40: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
bc50: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
bc60: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
bc70: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
bc80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
bc90: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
bca0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
bcb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
bcc0: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
bcd0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
bce0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
bcf0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
bd00: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
bd10: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
bd20: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
bd30: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
bd40: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
bd50: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
bd60: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
bd70: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
bd80: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
bd90: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
bda0: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
bdb0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
bdc0: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
bdd0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
bde0: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
bdf0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
be00: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
be10: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
be20: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
be30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
be40: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
be50: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
be60: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
be70: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
be80: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
be90: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
bea0: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
beb0: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
bec0: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
bed0: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
bee0: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
bef0: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
bf00: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
bf10: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
bf20: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
bf30: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
bf40: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
bf50: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
bf60: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
bf70: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
bf80: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
bf90: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
bfa0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  ->nChange;.  ret
bfb0: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
bfc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
bfd0: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
bfe0: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
bff0: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
c000: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
c010: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
c020: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
c030: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
c040: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
c050: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
c060: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
c070: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
c080: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
c090: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
c0a0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
c0b0: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
c0c0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
c0d0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
c0e0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
c0f0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
c100: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
c110: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
c120: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
c130: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
c140: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
c150: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
c160: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c170: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
c180: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46  me);.  }.  p->pF
c190: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  rame = 0;.  p->n
c1a0: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  Frame = 0;..  if
c1b0: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
c1c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
c1d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
c1e0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
c1f0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
c200: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
c210: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
c220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c230: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
c240: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
c250: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
c260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
c270: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
c280: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
c290: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
c2a0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
c2b0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
c2c0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
c2d0: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
c2e0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
c2f0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
c300: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
c310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
c320: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
c330: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
c340: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
c350: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
c360: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c370: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
c380: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
c390: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
c3a0: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
c3b0: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
c3c0: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
c3d0: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
c3e0: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
c3f0: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
c400: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
c410: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
c420: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
c430: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
c440: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c450: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
c460: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c470: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
c480: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
c490: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
c4a0: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
c4b0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
c4c0: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
c4d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
c4e0: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
c4f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
c500: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
c510: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
c520: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
c530: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
c540: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
c550: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
c560: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
c570: 49 6e 76 61 6c 69 64 20 29 3b 0a 20 20 7d 0a 23  Invalid );.  }.#
c580: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
c590: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
c5a0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
c5b0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
c5c0: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
c5d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c5e0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c5f0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
c600: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
c610: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
c620: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
c630: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
c640: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
c650: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
c660: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
c670: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
c680: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
c690: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
c6a0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
c6b0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
c6c0: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
c6d0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
c6e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c6f0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
c700: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
c710: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
c720: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
c730: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c740: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
c750: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c760: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c770: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c780: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c790: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c7a0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
c7b0: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
c7c0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
c7d0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
c7e0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
c7f0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
c800: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c810: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
c820: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
c830: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
c840: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
c850: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
c860: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
c870: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
c880: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
c890: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
c8a0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
c8b0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
c8c0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
c8d0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
c8e0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
c8f0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
c900: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
c910: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
c920: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
c930: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
c940: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
c950: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
c960: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c970: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
c980: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
c990: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
c9a0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
c9b0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
c9c0: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
c9d0: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
c9e0: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
c9f0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
ca00: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
ca10: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
ca20: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
ca30: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
ca40: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
ca50: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
ca60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ca70: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
caa0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
cab0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
cae0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
caf0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
cb00: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
cb30: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
cb40: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
cb50: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
cb70: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
cb80: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
cb90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
cba0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
cbb0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
cbc0: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
cbd0: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
cbe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
cbf0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
cc00: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
cc10: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
cc20: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
cc30: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
cc40: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
cc50: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
cc60: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
cc70: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
cc80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
cc90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
cca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
ccb0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
ccc0: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
ccd0: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
cce0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
ccf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
cd00: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
cd10: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
cd20: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
cd30: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
cd40: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
cd50: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
cd60: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
cd70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
cd90: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
cda0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
cdb0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
cdc0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
cdd0: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
cde0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
cdf0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
ce00: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
ce10: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
ce20: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
ce30: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
ce40: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
ce50: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
ce60: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
ce70: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
ce80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
ce90: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
cea0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
ceb0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
cec0: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
ced0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
cee0: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
cef0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
cf00: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
cf10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cf20: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
cf30: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
cf40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cf50: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
cf60: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
cf70: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
cf80: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
cf90: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
cfa0: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
cfb0: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
cfc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cfd0: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
cfe0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
cff0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
d000: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
d010: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
d020: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
d030: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
d040: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
d050: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
d060: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
d070: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
d080: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
d090: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d0a0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
d0b0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
d0c0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
d0d0: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
d0e0: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
d0f0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
d100: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d110: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
d120: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
d130: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
d140: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
d150: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
d160: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
d170: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
d180: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
d190: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
d1a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d1b0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
d1c0: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
d1d0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
d1e0: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
d1f0: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
d200: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
d210: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
d220: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
d230: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
d240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
d250: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
d260: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
d270: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
d280: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
d290: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d2a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
d2b0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d2c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d2d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
d2e0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
d2f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
d300: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
d310: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
d320: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
d330: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
d340: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
d350: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
d360: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
d370: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
d390: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
d3a0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
d3b0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
d3c0: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
d3d0: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
d3e0: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
d3f0: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
d400: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
d410: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
d420: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
d430: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
d440: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d450: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d460: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
d470: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d480: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
d490: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
d4a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
d4b0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
d4c0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
d4d0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
d4e0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
d4f0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
d500: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
d510: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
d520: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
d530: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
d540: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d550: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
d560: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
d570: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
d580: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d590: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
d5a0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
d5b0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
d5c0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
d5d0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
d5e0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
d5f0: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
d600: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
d610: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
d620: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
d630: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
d640: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
d650: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
d660: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
d670: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d680: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d690: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d6a0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d6b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d6c0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d6d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d6e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d6f0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
d700: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d710: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
d720: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
d730: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
d740: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
d750: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
d760: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
d770: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
d780: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
d790: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
d7a0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
d7b0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
d7c0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d7d0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
d7e0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
d7f0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
d800: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
d810: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
d820: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d830: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d840: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
d850: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d860: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d870: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d880: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d890: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d8a0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d8b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d8c0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d8d0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d8f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d900: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d910: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d920: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
d930: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
d940: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
d950: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
d960: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d970: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
d980: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
d990: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d9a0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
d9b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
d9c0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
d9d0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
d9e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9f0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
da00: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
da10: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
da20: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
da30: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
da40: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
da50: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
da60: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
da70: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
da80: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
da90: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
daa0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
dab0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
dac0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
dad0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
dae0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
daf0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
db00: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
db10: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
db20: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
db30: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
db40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
db50: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
db60: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
db70: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
db80: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
db90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
dba0: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
dbb0: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
dbc0: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
dbd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
dbe0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
dbf0: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
dc00: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
dc10: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
dc20: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
dc30: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
dc40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
dc50: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
dc60: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
dc70: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dc80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
dc90: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
dca0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
dcb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
dcc0: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
dcd0: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
dce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
dcf0: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
dd00: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
dd10: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dd20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dd30: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
dd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
dd50: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
dd60: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
dd70: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
dd80: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
dd90: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
dda0: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
ddb0: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
dde0: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
ddf0: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
de00: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
de10: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
de20: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
de30: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
de40: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
de50: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
de60: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
de70: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
de80: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
de90: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
dea0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
deb0: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
dec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
ded0: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
dee0: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
def0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df00: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
df10: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
df20: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
df30: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
df40: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
df50: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
df60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
df70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
df80: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
df90: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
dfa0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
dfb0: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
dfc0: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
dfd0: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
dfe0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
dff0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
e000: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
e010: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
e020: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
e030: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
e040: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
e050: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
e060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e070: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e080: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e090: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e0a0: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
e0b0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
e0c0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
e0d0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
e0e0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
e0f0: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
e100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e110: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e120: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
e130: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
e140: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e150: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e160: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
e170: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
e180: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
e190: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
e1a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e1b0: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
e1c0: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
e1d0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
e1e0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
e1f0: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
e200: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
e210: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
e220: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e230: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e240: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
e250: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
e260: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
e270: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
e280: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
e290: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
e2a0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
e2b0: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
e2c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
e2d0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
e2e0: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
e2f0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
e300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e310: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
e320: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
e330: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
e340: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
e350: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
e360: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
e370: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
e380: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
e390: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
e3a0: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
e3b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e3c0: 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
e3d0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
e3e0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
e3f0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
e400: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
e410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
e430: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
e440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e450: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e460: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
e470: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e480: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e490: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e4a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e4b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e4c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
e4d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e4e0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
e4f0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
e500: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
e510: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
e520: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
e530: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e540: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
e550: 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
e560: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
e570: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
e580: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
e590: 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
e5a0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
e5b0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
e5c0: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
e5d0: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
e5e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e5f0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e600: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
e610: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
e620: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
e630: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e640: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e650: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e670: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
e680: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
e690: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e6a0: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
e6b0: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
e6c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e6d0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
e6e0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e6f0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
e700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
e710: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
e720: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e730: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
e740: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
e750: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
e760: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
e770: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
e780: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e790: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
e7a0: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
e7b0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
e7c0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e7d0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
e7e0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
e7f0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
e800: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
e810: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e820: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
e830: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e840: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
e850: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
e860: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e870: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
e880: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e890: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e8a0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
e8b0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e8c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e8d0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e8e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e8f0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e900: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
e910: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
e920: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
e930: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
e940: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
e950: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e960: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e980: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e990: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e9a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e9b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
e9c0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
e9e0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
e9f0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
ea00: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
ea10: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
ea20: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
ea30: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
ea40: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
ea50: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
ea60: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
ea70: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ea80: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ea90: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
eaa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
eab0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
eac0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
ead0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
eae0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
eaf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
eb00: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
eb10: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
eb20: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
eb30: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
eb40: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
eb50: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
eb60: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
eb70: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
eb80: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
eb90: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
eba0: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
ebb0: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
ebc0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
ebd0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
ebe0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
ebf0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
ec00: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
ec10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
ec20: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
ec30: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
ec40: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
ec50: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
ec60: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
ec70: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
ec80: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
ec90: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
eca0: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
ecb0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
ecc0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
ecd0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
ece0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ecf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ed00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ed10: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
ed20: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ed30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
ed40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ed50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ed60: 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
ed70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed80: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
ed90: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
eda0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
edb0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
edc0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
edd0: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
ede0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
edf0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
ee00: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ee10: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
ee20: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
ee30: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
ee40: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
ee50: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
ee60: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
ee70: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
ee80: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
ee90: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
eea0: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
eeb0: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
eec0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
eed0: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
eee0: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
eef0: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
ef00: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
ef10: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
ef20: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
ef30: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
ef40: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
ef50: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
ef60: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
ef70: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
ef80: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
ef90: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
efa0: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
efb0: 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
efc0: 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
efd0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
efe0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
eff0: 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  RUN && p->pc>=0 
f000: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
f010: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
f020: 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
f030: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e++;.    }.    p
f040: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
f050: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
f060: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
f070: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t );.  assert( n
f080: 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65  Write==db->write
f090: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
f0a0: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
f0b0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
f0c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
f0d0: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
f0e0: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
f0f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
f100: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
f110: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
f120: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
f130: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
f140: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
f150: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
f160: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
f170: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
f180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
f190: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
f1a0: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
f1b0: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
f1c0: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
f1d0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
f1e0: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
f1f0: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
f200: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
f210: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
f220: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
f230: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
f240: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
f250: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
f260: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
f270: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
f280: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
f290: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
f2a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
f2b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
f2c0: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
f2d0: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
f2e0: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
f2f0: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
f300: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
f310: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
f320: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
f330: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
f340: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
f350: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
f360: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
f370: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
f380: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
f390: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
f3a0: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
f3b0: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
f3c0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
f3d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
f3e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f3f0: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
f400: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f410: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
f420: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
f430: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
f440: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
f450: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
f460: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
f470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
f480: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
f490: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
f4a0: 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
f4b0: 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
f4c0: 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
f4d0: 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
f4e0: 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
f4f0: 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
f500: 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
f510: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
f520: 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
f530: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
f540: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
f550: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f560: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
f570: 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
f580: 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
f590: 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
f5a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f5b0: 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  commtted..**.** 
f5c0: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f5d0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
f5e0: 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
f5f0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f600: 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
f610: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
f620: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
f630: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
f640: 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
f650: 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
f660: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
f670: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f680: 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
f690: 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
f6a0: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
f6b0: 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
f6c0: 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
f6d0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f6e0: 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
f6f0: 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
f700: 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
f710: 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
f720: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
f730: 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61  have occured, ca
f740: 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
f750: 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
f760: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
f770: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
f780: 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
f790: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
f7a0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
f7b0: 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
f7c0: 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
f7d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
f7e0: 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
f7f0: 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
f800: 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
f810: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f820: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
f830: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
f840: 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
f850: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
f860: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
f870: 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
f880: 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
f890: 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
f8a0: 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
f8b0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f8c0: 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
f8d0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
f8e0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f8f0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f900: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
f920: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
f930: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
f940: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
f950: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
f960: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
f970: 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
f980: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
f990: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
f9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f9b0: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
f9c0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
f9d0: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
f9e0: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
f9f0: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
fa00: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
fa10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fa20: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
fa30: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
fa40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fa50: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
fa60: 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
fa70: 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
fa80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fa90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
faa0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
fab0: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
fac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
fad0: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
fae0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
faf0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
fb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fb10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fb20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fb30: 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
fb40: 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
fb50: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
fb60: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
fb70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
fb80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
fb90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
fba0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
fbb0: 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
fbc0: 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
fbd0: 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
fbe0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
fbf0: 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
fc00: 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
fc10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
fc20: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
fc30: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
fc40: 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
fc50: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
fc60: 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
fc70: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
fc80: 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
fc90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
fca0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fcb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
fcc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
fcd0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
fce0: 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
fcf0: 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
fd00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
fd10: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
fd20: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
fd30: 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
fd40: 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
fd50: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
fd60: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
fd70: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
fd80: 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
fd90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
fda0: 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
fdb0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
fdc0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
fdd0: 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
fde0: 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
fdf0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
fe00: 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
fe10: 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
fe20: 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
fe30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
fe40: 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  T and write.** a
fe50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
fe60: 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
fe70: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
fe80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
fe90: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
fea0: 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
feb0: 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
fec0: 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
fed0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
fee0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
fef0: 28 64 65 66 65 72 72 65 64 20 26 26 20 64 62 2d  (deferred && db-
ff00: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30  >nDeferredCons>0
ff10: 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20  ) || (!deferred 
ff20: 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
ff30: 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d  int>0) ){.    p-
ff40: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
ff50: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e  STRAINT;.    p->
ff60: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
ff70: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
ff80: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
ff90: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66  >zErrMsg, db, "f
ffa0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
ffb0: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
ffc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
ffe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fff0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10010 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
10020 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
10030 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
10040 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
10050 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
10060 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
10070 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
10080 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
10090 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
100a0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
100b0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
100c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
100d0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
100e0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
100f0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
10100 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
10110 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
10120 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
10130 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
10140 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
10150 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
10160 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
10170 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
10180 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
10190 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
101a0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
101b0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
101c0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
101d0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
101e0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
101f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
10200 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
10210 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
10220 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
10230 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
10240 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
10250 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
10260 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
10270 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10290 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
102a0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
102b0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
102c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
102d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
102e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
102f0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
10300 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
10310 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
10320 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
10330 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
10340 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10350 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
10360 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
10370 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
10380 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
10390 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
103a0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
103b0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
103c0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
103d0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
103e0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
103f0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
10400 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
10410 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
10420 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
10430 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
10440 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
10450 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
10460 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
10470 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
10480 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
10490 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
104a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
104b0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
104c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
104d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
104e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
104f0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
10500 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
10510 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
10520 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10530 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
10540 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
10550 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
10560 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
10570 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
10580 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
10590 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
105a0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
105b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
105c0 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
105d0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
105e0 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
105f0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
10600 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
10610 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
10620 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
10630 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
10640 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
10650 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
10660 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
10670 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
10680 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
10690 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
106a0 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
106b0 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
106c0 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
106d0 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
106e0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
106f0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
10700 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
10710 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
10720 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
10730 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
10740 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
10750 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73  c & 0xff;.    as
10760 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
10770 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
10780 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72  D );  /* This er
10790 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78  ror no longer ex
107a0 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70  ists */.    isSp
107b0 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
107c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
107d0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
107e0 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
107f0 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
10800 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
10810 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
10820 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69  _FULL;.    if( i
10830 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b  sSpecialError ){
10840 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10850 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d   query was read-
10860 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72  only and the err
10870 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
10880 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20  E_INTERRUPT, .  
10890 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61      ** no rollba
108a0 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ck is necessary.
108b0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c   Otherwise, at l
108c0 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74  east a savepoint
108d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
108e0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
108f0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65  olled back to re
10900 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
10910 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a  se to a .      *
10920 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  * consistent sta
10930 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
10940 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68     ** Even if th
10950 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
10960 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20  ead-only, it is 
10970 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72  important to per
10980 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20  form.      ** a 
10990 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
109a0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
109b0 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20  k operation. If 
109c0 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20  the error .     
109d0 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c   ** occured whil
109e0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
109f0 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
10a00 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
10a10 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
10a20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
10a30 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
10a40 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
10a50 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
10a60 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
10a70 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
10a80 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
10a90 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
10aa0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
10ab0 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
10ac0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
10ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
10ae0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
10af0 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
10b00 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
10b10 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
10b20 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
10b30 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
10b40 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
10b50 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
10b60 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
10b70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10b80 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
10b90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
10ba0 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
10bb0 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
10bc0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
10bd0 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
10be0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
10bf0 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
10c00 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
10c10 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
10c20 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
10c30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10c40 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
10c50 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
10c60 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
10c70 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10c80 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
10ca0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
10cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
10cc0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
10cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ce0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10cf0 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
10d00 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
10d10 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
10d20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
10d50 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
10d60 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
10d70 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10d80 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
10d90 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
10da0 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
10db0 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
10dc0 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
10dd0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
10de0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10df0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
10e00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
10e10 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
10e20 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
10e30 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
10e40 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
10e50 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
10e60 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
10e70 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
10e80 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
10e90 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
10ea0 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
10eb0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10ec0 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
10ed0 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
10ee0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10ef0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
10f00 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10f10 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
10f20 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
10f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10f40 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
10f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10f70 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
10f80 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
10f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10fa0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
10fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
10fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10fd0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
10fe0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10ff0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
11000 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
11010 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
11020 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11030 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
11040 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
11050 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
11060 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
11070 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
11080 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
11090 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
110a0 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
110b0 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
110c0 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
110d0 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
110e0 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
110f0 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
11100 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
11110 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
11120 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
11130 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
11140 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
11150 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
11160 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
11170 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11180 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11190 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
111a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
111b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
111c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
111d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
111e0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
111f0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
11200 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
11210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11220 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
11230 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
11240 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
11250 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
11260 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
11270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11280 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11290 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
112a0 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
112b0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
112c0 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
112d0 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
112e0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
112f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
11300 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
11310 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
11320 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
11330 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
11340 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11350 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
11360 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
11370 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
11380 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
11390 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
113a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
113b0 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
113c0 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
113d0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
113e0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
113f0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
11400 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
11410 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
11420 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
11430 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11440 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
11450 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
11460 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
11470 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11480 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
11490 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
114a0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
114b0 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
114c0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
114d0 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
114e0 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
114f0 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
11500 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
11510 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
11520 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
11530 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
11540 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
11550 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
11560 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
11570 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
11580 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
11590 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
115a0 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
115b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
115c0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
115d0 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
115e0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
115f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11600 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11610 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
11620 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
11630 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
11640 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
11650 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11660 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
11670 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
11680 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
11690 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c   }.        inval
116a0 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
116b0 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
116c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
116d0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
116e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
116f0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11700 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11710 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11730 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
11740 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
11750 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
11760 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
11770 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
11780 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
11790 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
117a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
117b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
117c0 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
117d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
117e0 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
117f0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
11800 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
11810 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
11820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11830 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
11840 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
11850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
11860 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
11870 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
11880 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
11890 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
118a0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62  .  .    /* Rollb
118b0 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e  ack or commit an
118c0 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  y schema changes
118d0 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20   that occurred. 
118e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
118f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  !=SQLITE_OK && d
11900 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
11910 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
11920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11930 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
11940 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20 20  a(db, -1);.     
11950 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
11960 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
11970 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
11980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
11990 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
119a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
119b0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
119c0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
119d0 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
119e0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
119f0 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
11a00 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
11a10 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11a20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
11a30 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
11a40 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
11a50 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
11a60 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
11a70 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
11a80 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
11a90 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
11aa0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
11ab0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
11ac0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
11ad0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
11ae0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
11af0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
11b00 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11b10 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11b20 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11b30 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
11b40 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
11b50 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
11b60 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
11b70 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
11b80 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
11b90 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
11ba0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
11bb0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
11bc0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
11bd0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
11be0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
11bf0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
11c00 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11c10 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11c20 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11c30 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11c40 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11c50 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
11c60 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
11c70 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
11c80 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
11c90 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
11ca0 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
11cb0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
11cc0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
11cd0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
11ce0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
11cf0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
11d00 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
11d10 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11d20 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11d30 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11d40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11d50 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
11d60 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
11d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11d80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
11d90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
11da0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
11db0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
11dc0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
11dd0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
11de0 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
11df0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
11e00 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
11e10 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
11e20 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
11e30 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
11e40 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11e50 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
11e60 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
11e70 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
11e80 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
11e90 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
11ea0 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
11eb0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
11ec0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
11ed0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
11ee0 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
11ef0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11f00 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
11f10 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
11f20 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
11f30 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
11f40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11f50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
11f60 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
11f80 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
11f90 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
11fa0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
11fb0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
11fd0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
11fe0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
11ff0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
12000 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
12010 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
12020 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12030 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
12040 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  c;.}../*.** Clea
12060 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
12070 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
12080 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
12090 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
120a0 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
120b0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
120c0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
120d0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
120e0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
120f0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
12100 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
12110 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
12120 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
12130 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
12140 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
12150 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
12160 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
12170 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
12180 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
12190 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
121a0 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
121b0 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
121c0 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
121d0 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
121e0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
121f0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
12200 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
12210 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
12220 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
12230 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
12240 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
12250 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
12260 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
12270 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
12280 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
12290 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
122a0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
122b0 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
122c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
122d0 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
122e0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
122f0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
12300 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
12310 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
12320 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
12330 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
12340 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
12350 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
12360 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
12370 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
12380 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
12390 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
123a0 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
123b0 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
123c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
123d0 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
123e0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
123f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
12400 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12410 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
12420 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
12430 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12440 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
12450 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
12460 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
12470 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
12480 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
12490 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
124a0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
124b0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
124c0 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
124d0 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
124e0 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
124f0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
12500 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
12510 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
12520 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
12530 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
12540 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
12550 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
12560 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
12570 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
12580 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
12590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
125a0 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
125b0 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
125c0 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
125d0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
125e0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  T);.    sqlite3D
125f0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12600 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
12610 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
12620 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
12630 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
12640 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
12650 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
12660 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
12670 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
12680 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
12690 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
126a0 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
126b0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
126c0 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
126d0 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
126e0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
126f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
12700 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
12710 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
12720 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
12730 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
12740 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
12750 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
12760 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
12770 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12780 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
12790 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
127a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
127b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
127c0 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
127d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
127e0 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
127f0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
12800 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
12810 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
12820 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
12830 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
12840 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
12850 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12860 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
12870 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
12880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12890 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
128a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
128b0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
128c0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
128d0 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
128e0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
128f0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
12900 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
12910 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
12920 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
12930 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
12940 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
12950 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
12960 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
12970 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
12980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12990 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
129a0 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
129b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
129c0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
129d0 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
129e0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
129f0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
12a00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
12a10 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
12a20 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
12a30 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
12a40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12a50 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
12a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12a70 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
12a80 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
12a90 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
12aa0 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
12ab0 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
12ac0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
12ad0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
12ae0 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
12af0 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
12b00 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
12b10 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
12b20 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
12b30 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
12b40 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
12b50 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
12b60 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12b70 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
12b80 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
12b90 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
12ba0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
12bb0 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
12bc0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
12bd0 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
12be0 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
12bf0 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
12c00 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28  >31 || !(mask&((
12c10 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26  (u32)1)<<i))) &&
12c20 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
12c30 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
12c40 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
12c50 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
12c60 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
12c70 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
12c80 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
12c90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
12ca0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
12cb0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12cc0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
12cd0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12ce0 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ment..** The dif
12cf0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
12d00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
12d10 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12d20 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
12d30 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
12d40 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
12d50 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
12d60 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
12d70 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
12d80 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12d90 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
12da0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
12db0 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
12dc0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
12dd0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
12de0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
12df0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
12e00 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
12e10 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
12e20 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
12e30 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
12e40 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
12e50 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
12e60 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
12e70 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
12e80 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
12e90 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
12ea0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
12eb0 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
12ec0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
12ed0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
12ee0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
12ef0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
12f00 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
12f10 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
12f20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
12f30 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
12f40 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  i]);.  vdbeFreeO
12f50 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
12f60 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
12f70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f80 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
12f90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12fa0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
12fb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12fc0 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
12fd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12fe0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64  p->pFree);.#if d
12ff0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
13000 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
13010 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  N).  sqlite3DbFr
13020 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61  ee(db, p->zExpla
13030 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  in);.  sqlite3Db
13040 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70  Free(db, p->pExp
13050 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lain);.#endif.  
13060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13070 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
13080 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
13090 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
130a0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
130b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
130c0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
130d0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
130e0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
130f0 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  db;.  if( p->pPr
13100 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
13110 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
13120 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
13130 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
13140 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
13150 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
13160 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
13170 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
13180 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
13190 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
131a0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
131b0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
131c0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
131d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a  te3VdbeDeleteObj
131e0 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ect(db, p);.}../
131f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
13200 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
13210 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
13220 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
13230 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
13240 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
13250 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
13260 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
13270 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
13280 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
13290 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
132a0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
132b0 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
132c0 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
132d0 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
132e0 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
132f0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
13300 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
13310 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
13320 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
13330 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
13340 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
13350 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
13360 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
13370 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
13380 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
13390 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
133a0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
133b0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
133c0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
133d0 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
133e0 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
133f0 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
13400 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
13410 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
13420 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
13430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13440 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
13450 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
13460 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
13470 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
13480 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
13490 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
134a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
134b0 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69  EST.    extern i
134c0 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
134d0 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
134e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
134f0 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63  sTable );.    rc
13500 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
13510 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
13520 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
13530 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
13540 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
13550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13560 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
13570 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67   = p->movetoTarg
13580 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21  et;.    if( res!
13590 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
135a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
135b0 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
135c0 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66  alid = 1;.#ifdef
135d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
135e0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
135f0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
13600 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
13610 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
13620 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
13630 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
13640 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
13650 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
13660 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
13670 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
13680 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
13690 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
136a0 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
136b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
136c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
136d0 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
136e0 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
136f0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
13700 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
13710 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
13720 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13730 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
13740 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
13750 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
13760 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13770 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
13780 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
13790 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
137a0 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
137b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
137c0 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
137d0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
137e0 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
137f0 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
13800 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
13810 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
13820 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
13830 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
13840 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
13850 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
13860 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
13870 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
13880 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
13890 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
138a0 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
138b0 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
138c0 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
138d0 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
138e0 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
138f0 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
13900 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
13910 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
13920 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
13930 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
13940 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
13950 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
13960 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
13970 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
13980 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
13990 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
139a0 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
139b0 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
139c0 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
139d0 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
139e0 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
139f0 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
13a00 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
13a10 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
13a20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
13a30 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
13a40 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
13a50 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
13a60 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
13a70 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
13a80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
13a90 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
13aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
13ac0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13ad0 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
13b00 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
13b30 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13b40 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
13b50 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
13b60 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13b70 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
13ba0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13bb0 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13be0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13bf0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
13c00 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
13c10 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
13c20 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
13c50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13c60 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
13c80 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
13c90 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13cc0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
13cd0 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
13d00 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
13d10 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
13d40 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
13d50 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
13d60 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
13d70 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
13d80 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
13d90 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
13da0 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
13db0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
13dc0 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
13dd0 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
13de0 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
13df0 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
13e00 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
13e10 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
13e20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
13e30 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
13e40 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
13e50 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
13e60 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
13e70 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
13e80 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
13e90 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
13ea0 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
13eb0 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
13ec0 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
13ed0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
13ee0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
13ef0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
13f00 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
13f10 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
13f20 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
13f30 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
13f40 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
13f50 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
13f60 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
13f70 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
13f80 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
13f90 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
13fa0 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
13fb0 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
13fc0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
13fd0 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20  urn 8+(u32)i;.  
13fe0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20    }.    if( i<0 
13ff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
14000 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
14010 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
14020 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
14030 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
14040 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
14050 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
14060 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
14070 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
14080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
14090 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
140a0 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
140b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
140c0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
140d0 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
140e0 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
140f0 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
14100 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
14110 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
14120 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
14130 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
14140 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
14150 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
14160 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
14170 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
14180 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
14190 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
141a0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
141b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
141c0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
141d0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
141e0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
141f0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
14200 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
14210 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
14220 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14230 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
14240 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
14250 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
14260 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
14270 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
14280 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14290 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
142a0 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
142b0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
142c0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
142d0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
142e0 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
142f0 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
14300 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
14310 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
14320 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
14330 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
14340 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
14350 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
14360 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
14370 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
14380 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
14390 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
143a0 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
143b0 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
143c0 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
143d0 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
143e0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
143f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
14400 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
14410 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
14420 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
14430 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
14440 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
14450 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
14460 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
14470 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
14480 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
14490 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
144a0 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
144b0 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
144c0 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
144d0 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
144e0 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
144f0 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
14500 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
14510 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
14520 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
14530 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
14540 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
14550 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
14560 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
14570 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
14580 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
14590 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
145a0 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
145b0 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
145c0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
145d0 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
145e0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
145f0 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
14600 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
14610 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
14620 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
14630 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
14640 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
14650 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
14660 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
14670 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
14680 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
14690 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
146a0 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
146b0 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
146c0 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
146d0 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
146e0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
146f0 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
14700 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
14710 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
14720 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
14730 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
14740 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
14750 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
14760 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
14770 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
14780 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
14790 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
147a0 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
147b0 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
147c0 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
147d0 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
147e0 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
147f0 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
14800 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
14810 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
14820 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
14830 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
14840 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
14850 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
14860 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
14870 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
14880 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
14890 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
148a0 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
148b0 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
148c0 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
148d0 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
148e0 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
148f0 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
14900 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
14910 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
14920 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
14930 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
14940 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
14950 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
14960 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
14970 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
14980 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
14990 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
149a0 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
149b0 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
149c0 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
149d0 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
149e0 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
149f0 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
14a00 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
14a10 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
14a20 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
14a30 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
14a40 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
14a50 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
14a60 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
14a70 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
14a80 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
14a90 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
14aa0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
14ab0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
14ac0 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
14ad0 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
14ae0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
14af0 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
14b00 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
14b10 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
14b20 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
14b30 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
14b40 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
14b50 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
14b60 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
14b70 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
14b80 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
14b90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14ba0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
14bb0 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
14bc0 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
14bd0 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
14be0 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
14bf0 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
14c00 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14c10 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
14c20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
14c30 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
14c40 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
14c50 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14c60 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
14c70 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
14c80 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
14c90 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
14ca0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
14cb0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14cc0 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
14cd0 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
14ce0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
14cf0 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
14d00 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
14d10 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
14d20 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
14d30 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
14d40 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14d50 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
14d60 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
14d70 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
14d80 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
14d90 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
14da0 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
14db0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14dc0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14dd0 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
14de0 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
14df0 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
14e00 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
14e10 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
14e20 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
14e30 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
14e40 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
14e50 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
14e60 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
14e70 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
14e80 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
14e90 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
14ea0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
14eb0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
14ec0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
14ed0 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
14ee0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
14ef0 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
14f00 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
14f10 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
14f20 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
14f30 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
14f40 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
14f50 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
14f60 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
14f70 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14f80 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
14f90 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
14fa0 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
14fb0 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
14fc0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
14fd0 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
14fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
14ff0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
15000 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
15010 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15020 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
15030 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
15040 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
15050 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
15060 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
15070 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
15080 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
15090 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
150a0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
150b0 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
150c0 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
150d0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
150e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
150f0 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
15100 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
15110 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
15120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
15130 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
15140 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
15150 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
15160 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
15170 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
15180 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
15190 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
151a0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
151b0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
151c0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
151d0 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
151e0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
151f0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
15200 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
15210 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
15220 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
15230 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
15240 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
15250 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
15260 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
15270 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15280 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
15290 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
152a0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
152b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
152c0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
152d0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
152e0 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
152f0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
15300 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
15310 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
15320 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
15330 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15340 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
15350 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
15360 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
15370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15380 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
15390 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
153a0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
153b0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
153c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
153d0 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
153e0 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
153f0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
15400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
15410 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
15420 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
15430 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
15440 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
15450 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
15460 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
15470 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
15480 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
15490 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
154a0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
154b0 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
154c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
154d0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
154e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
154f0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
15500 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
15510 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15520 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
15530 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
15540 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
15550 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15560 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15570 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
15580 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
15590 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
155a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
155b0 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
155c0 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
155d0 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
155e0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
155f0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
15600 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
15610 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
15620 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
15630 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
15640 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
15650 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
15660 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
15670 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
15680 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15690 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
156a0 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
156b0 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
156c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
156d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
156e0 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
156f0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
15700 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
15710 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
15720 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15730 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
15740 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
15750 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
15760 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
15770 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
15780 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
15790 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
157a0 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
157b0 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
157c0 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
157d0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
157e0 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
157f0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
15800 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
15810 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
15820 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
15830 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15840 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
15850 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
15860 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
15870 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
15880 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
15890 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
158a0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
158b0 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
158c0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
158d0 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
158e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
158f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
15900 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
15910 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
15920 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15930 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
15940 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
15950 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
15960 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
15970 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
15980 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
15990 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
159a0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
159b0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
159c0 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
159d0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
159e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
159f0 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
15a00 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
15a10 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
15a20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
15a30 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
15a40 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
15a50 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
15a60 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
15a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15a80 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
15a90 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
15aa0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
15ab0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
15ac0 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
15ad0 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
15ae0 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
15af0 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
15b00 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
15b10 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
15b20 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
15b30 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
15b40 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
15b50 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
15b60 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
15b70 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
15b80 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
15b90 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
15ba0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15bb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
15bd0 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
15be0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
15bf0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
15c00 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15c10 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
15c20 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
15c30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
15c40 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15c50 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
15c60 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
15c70 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
15c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15c90 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
15ca0 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
15cb0 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
15cc0 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
15cd0 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
15ce0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
15cf0 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
15d00 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15d10 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
15d30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
15d40 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
15d50 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
15d60 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
15d70 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
15d80 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
15d90 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
15da0 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
15db0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15dc0 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
15dd0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15de0 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
15df0 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
15e00 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
15e10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
15e20 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
15e30 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
15e40 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
15e50 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15e60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15e70 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
15e80 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
15e90 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
15ea0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
15eb0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
15ec0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
15ed0 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
15ee0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
15ef0 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
15f00 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
15f10 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
15f20 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
15f30 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
15f40 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
15f50 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
15f60 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
15f70 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
15f80 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
15f90 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
15fa0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
15fb0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
15fc0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
15fd0 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
15fe0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
15ff0 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
16000 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
16010 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
16020 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
16030 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
16040 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
16050 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
16060 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
16070 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
16080 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
16090 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
160a0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
160b0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
160c0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
160d0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
160e0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
160f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
16100 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
16110 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
16120 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
16130 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16150 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
16160 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
16170 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
161a0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
161b0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
161e0 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
161f0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
16200 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
16210 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
16220 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
16230 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
16240 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
16250 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
16260 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
16270 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
16280 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
162b0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
162c0 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
162d0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16300 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
16310 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
16320 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
16330 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
16340 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
16350 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
16360 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
16370 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
16380 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
16390 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
163a0 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
163b0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
163c0 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
163d0 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
163e0 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
163f0 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
16400 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
16410 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
16420 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
16430 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
16440 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
16450 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
16460 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
16470 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
16480 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
16490 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
164a0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
164b0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
164c0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
164d0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
164e0 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
164f0 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
16500 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
16510 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
16520 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
16530 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
16540 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
16550 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
16560 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
16570 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
16580 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
16590 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
165a0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
165b0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
165c0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
165d0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
165e0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
165f0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
16600 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
16610 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
16620 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
16630 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
16640 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
16650 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
16660 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
16670 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
16680 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
16690 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
166a0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
166b0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
166c0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
166d0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
166e0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
166f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16710 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
16720 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
16730 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16740 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
16750 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
16760 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16770 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
16780 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
16790 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
167a0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
167b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
167c0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
167d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
167e0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
167f0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
16820 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
16830 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
16860 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
16870 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
16880 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
16890 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c  ->aMem;..  p->fl
168a0 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ags = 0;.  asser
168b0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
168c0 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
168d0 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
168e0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
168f0 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
16900 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
16910 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
16920 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
16930 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
16940 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
16950 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
16960 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
16970 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
16980 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
16990 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
169a0 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
169b0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
169c0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
169d0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
169e0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
169f0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
16a00 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
16a10 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
16a20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
16a30 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
16a40 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
16a50 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
16a60 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
16a70 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
16a80 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
16a90 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
16aa0 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ld = u;.}../*.**
16ab0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
16ac0 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
16ad0 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
16ae0 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
16af0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
16b00 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
16b10 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
16b20 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
16b30 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
16b40 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
16b50 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
16b60 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
16b70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
16b80 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
16b90 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
16ba0 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
16bb0 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
16bc0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
16bd0 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
16be0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
16bf0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
16c00 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
16c10 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
16c20 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
16c30 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
16c40 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
16c50 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
16c60 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
16c70 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
16c80 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
16c90 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
16ca0 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
16cb0 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
16cc0 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
16cd0 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
16ce0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
16cf0 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
16d00 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
16d10 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
16d20 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
16d30 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16d40 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
16d50 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
16d60 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
16d70 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
16d80 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
16d90 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
16da0 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
16db0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
16dc0 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
16dd0 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
16de0 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
16df0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
16e00 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
16e10 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
16e20 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
16e30 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
16e40 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
16e50 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
16e60 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
16e70 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
16e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16e90 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
16ea0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
16eb0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
16ec0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
16ed0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16ee0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
16ef0 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
16f00 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
16f10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f20 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
16f30 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
16f40 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
16f50 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
16f60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16f70 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
16f80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16f90 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
16fa0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
16fb0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
16fc0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
16fd0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
16fe0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
16ff0 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
17000 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
17010 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
17020 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
17030 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
17040 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
17050 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
17060 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61  A_ONLY( mem1.zMa
17070 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
17080 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
17090 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
170a0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
170b0 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
170c0 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
170d0 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
170e0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
170f0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
17100 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
17110 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
17120 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
17130 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
17140 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
17150 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
17160 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
17170 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
17180 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
17190 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
171a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
171b0 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
171c0 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
171d0 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
171e0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
171f0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
17200 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
17210 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
17220 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
17230 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
17240 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
17250 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
17260 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
17270 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
17280 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
17290 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
172a0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
172b0 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
172c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
172d0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
172e0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46  1 = szHdr1;.  nF
172f0 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
17300 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65  >nField;.  while
17310 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
17320 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
17330 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  d ){.    u32 ser
17340 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
17350 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
17360 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
17370 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
17380 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
17390 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
173a0 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
173b0 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
173c0 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e  );.    if( d1>=n
173d0 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56  Key1 && sqlite3V
173e0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
173f0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30  (serial_type1)>0
17400 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
17410 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
17420 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
17430 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
17440 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
17450 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
17460 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
17470 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
17480 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
17490 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
174a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
174b0 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
174c0 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
174d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e               i<n
174f0 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
17500 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
17510 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
17520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17530 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
17540 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
17550 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20  nt below */..   
17560 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65     /* Invert the
17570 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61 72   result if we ar
17580 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72  e using DESC sor
17590 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
175a0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
175b0 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
175c0 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e  nField && pKeyIn
175d0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
175e0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
175f0 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
17600 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20     .      /* If 
17610 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43  the PREFIX_SEARC
17620 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  H flag is set an
17630 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63  d all fields exc
17640 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  ept the final.  
17650 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65      ** rowid fie
17660 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74  ld were equal, t
17670 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52  hen clear the PR
17680 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
17690 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20   and set .      
176a0 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64  ** pPKey2->rowid
176b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
176c0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
176d0 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79   in (pKey1, nKey
176e0 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  1)..      ** Thi
176f0 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
17700 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63   OP_IsUnique opc
17710 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
17720 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d      if( (pPKey2-
17730 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17740 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29  D_PREFIX_SEARCH)
17750 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e   && i==(pPKey2->
17760 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20  nField-1) ){.   
17770 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
17780 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20  1==szHdr1 && rc 
17790 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
177a0 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  t( mem1.flags & 
177b0 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
177c0 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73     pPKey2->flags
177d0 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52   &= ~UNPACKED_PR
177e0 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20  EFIX_SEARCH;.   
177f0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77       pPKey2->row
17800 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20  id = mem1.u.i;. 
17810 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
17820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17830 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a   }.    i++;.  }.
17840 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
17850 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
17860 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
17870 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
17880 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
17890 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
178a0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
178b0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
178c0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
178d0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
178e0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
178f0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
17900 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
17910 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
17920 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
17930 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
17940 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
17950 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
17960 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
17970 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
17980 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
17990 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66  t were equal. If
179a0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
179b0 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20  CRKEY.  ** flag 
179c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65  is set, then bre
179d0 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72  ak the tie by tr
179e0 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c  eating key2 as l
179f0 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  arger..  ** If t
17a00 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
17a10 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
17a20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
17a30 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
17a40 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e  xes.  ** are con
17a50 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
17a60 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ual.  Otherwise,
17a70 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20   the longer key 
17a80 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72  is the .  ** lar
17a90 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
17aa0 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
17ab0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
17ac0 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69  he longer.  ** i
17ad0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66  f there is a dif
17ae0 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
17af0 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
17b00 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
17b10 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17b20 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72  INCRKEY ){.    r
17b30 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20  c = -1;.  }else 
17b40 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
17b50 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
17b60 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
17b70 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20   /* Leave rc==0 
17b80 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  */.  }else if( i
17b90 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20  dx1<szHdr1 ){.  
17ba0 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
17bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
17bc0 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
17bd0 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
17be0 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
17bf0 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
17c00 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
17c10 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
17c20 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
17c30 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
17c40 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
17c50 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
17c60 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
17c70 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
17c80 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
17c90 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
17ca0 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
17cb0 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
17cc0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
17cd0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
17ce0 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
17cf0 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
17d00 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
17d10 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
17d20 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
17d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17d40 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
17d50 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
17d60 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
17d70 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
17d80 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
17d90 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
17da0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
17db0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
17dc0 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
17dd0 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
17de0 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
17df0 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
17e00 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
17e10 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
17e20 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
17e30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17e40 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
17e50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
17e60 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
17e70 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
17e80 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
17e90 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
17ea0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
17eb0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
17ec0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17ed0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
17ee0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
17ef0 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
17f00 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
17f10 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
17f20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
17f30 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
17f40 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
17f50 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
17f60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17f70 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
17f80 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
17f90 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
17fa0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
17fb0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
17fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
17fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
17fe0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
17ff0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
18000 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
18010 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
18020 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
18030 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
18040 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
18050 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
18060 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
18070 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18080 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
18090 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
180a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
180b0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
180c0 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
180d0 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
180e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
180f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
18100 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
18110 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
18120 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
18130 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
18140 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
18150 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
18160 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
18170 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18180 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
18190 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
181a0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
181b0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
181c0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
181d0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
181e0 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
181f0 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
18200 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
18210 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
18220 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
18230 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
18240 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
18250 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
18260 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
18270 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
18280 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
18290 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
182a0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
182b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
182c0 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
182d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
182e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
182f0 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
18300 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
18310 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
18320 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
18330 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
18340 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
18350 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
18360 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
18370 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
18380 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
18390 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
183a0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
183b0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
183c0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
183d0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
183e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
183f0 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
18400 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
18410 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
18420 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
18430 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
18440 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
18450 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
18460 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
18470 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
18480 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
18490 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
184a0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
184b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
184c0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
184d0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
184e0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
184f0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
18500 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
18510 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
18520 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18530 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
18540 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
18550 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
18560 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
18570 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
18580 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
18590 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
185a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
185b0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
185c0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
185d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
185e0 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
185f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
18600 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
18610 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18620 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
18630 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
18640 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
18650 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
18660 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
18670 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
18680 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
18690 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
186a0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
186b0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
186c0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
186d0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
186e0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
186f0 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
18700 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
18710 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
18720 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18730 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
18740 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
18750 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
18760 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
18770 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
18780 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
18790 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
187a0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
187b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
187c0 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
187d0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
187e0 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
187f0 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
18800 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
18810 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
18820 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
18830 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
18840 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
18850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18860 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
18870 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
18880 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
18890 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
188a0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
188b0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
188c0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
188d0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
188e0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
188f0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
18900 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
18930 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
18940 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
18950 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
18960 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
18970 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
18980 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
18990 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
189a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
189b0 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
189c0 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
189d0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
189e0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
189f0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
18a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18a10 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
18a20 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
18a30 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
18a40 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
18a50 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
18a60 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
18a70 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
18a80 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20  use of the say. 
18a90 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
18aa0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
18ab0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
18ac0 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
18ad0 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
18ae0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
18af0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
18b00 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
18b10 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
18b20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18b30 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  T;.  }.  memset(
18b40 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
18b50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18b60 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
18b70 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
18b80 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
18b90 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
18ba0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
18bb0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
18bc0 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
18bd0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
18be0 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20  EFIX_MATCH );.  
18bf0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
18c00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
18c10 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
18c20 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
18c30 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18c50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18c60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
18c70 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
18c80 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
18c90 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
18ca0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
18cb0 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
18cc0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
18cd0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
18ce0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
18cf0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
18d00 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
18d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18d20 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
18d30 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
18d40 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
18d50 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
18d60 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
18d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
18d80 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
18d90 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
18da0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
18db0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
18dc0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
18dd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18de0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
18df0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
18e00 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
18e10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
18e20 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
18e30 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
18e40 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
18e50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
18e60 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
18e70 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
18e80 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
18e90 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
18ea0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
18eb0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
18ec0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
18ed0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
18ee0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
18ef0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
18f00 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
18f10 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
18f20 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
18f30 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
18f40 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
18f50 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
18f60 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
18f70 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
18f80 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
18f90 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
18fa0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
18fb0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
18fc0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
18fd0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
18fe0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
18ff0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
19000 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
19010 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
19020 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
19030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19050 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
19060 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
19070 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
19080 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
19090 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
190a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
190b0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
190c0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
190d0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
190e0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
190f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
19100 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
19110 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
19120 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
19130 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
19140 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
19150 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
19160 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
19170 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
19180 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
19190 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
191a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
191b0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
191c0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
191d0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
191e0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
191f0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19200 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
19210 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
19220 47 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76  GetValue(Vdbe *v
19230 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61  , int iVar, u8 a
19240 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ff){.  assert( i
19250 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76  Var>0 );.  if( v
19260 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
19270 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61  m = &v->aVar[iVa
19280 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d  r-1];.    if( 0=
19290 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
192a0 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
192b0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
192c0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
192d0 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
192e0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
192f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19300 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
19310 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
19320 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19330 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
19340 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
19350 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
19360 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19370 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65  MemStoreType((Me
19380 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20  m *)pRet);.     
19390 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
193a0 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
193b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
193c0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
193d0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
193e0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
193f0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
19400 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
19410 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
19420 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
19430 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
19440 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
19450 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
19460 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
19470 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
19480 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
19490 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
194a0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
194b0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
194c0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
194d0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
194e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
194f0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
19500 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
19510 0a 20 20 7d 0a 7d 0a                             .  }.}.